如何在没有匹配索引的情况下更新列表值

how to update a list value, without matching index

您好,我正在尝试更新订单号及其时间列表。例如,我有四个如下所示的列表

    OrderNum1 = ['1','6','3']
    originaltime = ['12AM','5AM','7AM']

    OrderNum2 = ['1','3']
    newtime = ['2AM','2AM']

目标是将 'originaltime' 的值替换为 'newtime' if/when 的值,订单号匹配。

我以前用过这个

    for i,(a,b) in enumerate(zip(OrderNum1,OrderNum2)):
    if a == b:
    originaltime[i] = newtime[i]

但是不会更新ordernum 3的时间,因为索引不匹配。期望的结果是:

    print(originaltime)
    ['2AM', '5AM', '2AM']

你很接近!看看这个:

trans = {k: v for k, v in zip(OrderNum2, newtime)}

originaltime = [trans.get(k, item) for k, item in zip(OrderNum1, originaltime)]
print(originaltime)  # -> ['2AM', '5AM', '2AM']

试试这个:

for i in OrderNum2:
    pos2 = OrderNum2.index(i)
    for j in OrderNum1:
        pos1 = OderNum1.index(j)
        if i == j:
            originaltime[pos1] = newtime[pos2]

你可以试试

originaltime = [originaltime[i] if v not in OrderNum2 else newtime[OrderNum2.index(v)] for i, v in enumerate(OrderNum1)]
print(originaltime)

输出

['2AM', '5AM', '2AM']

您可以使用这个 for 循环来填补空白:

OrderNum1 = ['1','6','3']
originaltime = ['12AM','5AM','7AM']

OrderNum2 = ['1','3']
newtime = ['2AM','2AM']

for i,(a,b) in enumerate(zip(OrderNum1,OrderNum2)):
    if a != b:
        OrderNum2.insert(i,' ')
        newtime.insert(i,' ') 
    else:
        originaltime[i] = newtime[i]
        
print(originaltime)

输出:

['2AM', '5AM', '2AM']

我一直很喜欢列表操作问题!有很多方法可以解决此问题,但我会尝试提供与您的尝试类似的解决方案。

OrderNum1 = ['1','6','3']
originaltime = ['12AM','5AM','7AM']

OrderNum2 = ['1','3']
newtime = ['2AM','2AM']

for i, val in enumerate(OrderNum2):
    if val in OrderNum1:
        originaltime[int(val) - 1] = newtime[i]

print(originaltime)

您可以构建一个 OrderNum2-to-newtime dict() 以在订单号匹配时查找替换值,如果不匹配则使用原始时间:

OrderNum1 = ['1', '6', '3']
originaltime = ['12AM', '5AM', '7AM']

OrderNum2 = ['1', '3']
newtime = ['2AM', '2AM']


new_times = dict(zip(OrderNum2, newtime))
originaltime = [new_times.get(order_num, org_time) for order_num, org_time in zip(OrderNum1, originaltime)]

print(originaltime)

输出:

['2AM', '5AM', '2AM']

我尽量用字典写出同样的答案:

dict2 = dict()  # create a dictionary
for i in range(len(OrderNum2)):
    dict2[OrderNum2[i]] = newtime[i]
# your dictionary created

for j in range(len(OrderNum1)):
    if dict2.get(OrderNum1[j]):
        originaltime[j] = dict2.get(OrderNum1[j])

print(originaltime)