如何使用另一个列表列表中的详细信息更新列表列表

时间:2017-09-06 12:28:56

标签: python

我有一群员工和一份员工详细信息。如何将他们的姓氏添加到rota?

实际的rota有几百个条目,同一个人重复多次(但所有员工都有不同的名字),详细信息列表有大约100个条目,可能没有一个或两个员工。

下面的代码可以工作,但循环遍历每个rota条目的所有细节。有没有更有效的方法(使用Python 2.7),我可以添加'?'如果找不到名字?

rota = [['Paul'], ['Paul'], ['Steve'], ['Steve'], ['Steve'], ['Simon'], ['Bob'], ['Steve']]
details = [['Paul', 'Smith'], ['Simon', 'Says'], ['Steve', 'Brown']]

for eachName in rota:
    for eachEmployee in details:
        if eachName[0] == eachEmployee[0]:
            eachName.append(eachEmployee[1])

print rota

(对不起,如果这令人困惑,这是我能想到的最简单的例子!)

2 个答案:

答案 0 :(得分:2)

您只需将details转换为词典:

rota = [['Paul'], ['Paul'], ['Steve'], ['Steve'], ['Steve'], ['Simon'], ['Bob'], ['Steve']]
details = dict([['Paul', 'Smith'], ['Simon', 'Says'], ['Steve', 'Brown']])

for eachName in rota:
    surname = details.get(eachName[0])
    if surname:
        eachName.append(surname)

print(rota)

请注意,只剩下一个for循环,处理速度要快得多。

dict中的值可能是具有多个属性的元组:

>>> details = dict([['Paul', ('Smith', 32)], ['Simon', ('Says', 20)], ['Steve', ('Brown', 52)]])
>>> details
{'Steve': ('Brown', 52), 'Paul': ('Smith', 32), 'Simon': ('Says', 20)}

答案 1 :(得分:0)

您可以使用列表和字典理解有效地执行此操作,但需要注意 - 所有键必须位于两个列表中。请注意," Bob"的关键不匹配已从您的原始代码中注释掉。

>>> rota = [['Paul'], ['Paul'], ['Steve'], ['Steve'], ['Steve'], ['Simon']] #, ['Bob']]
>>> details = [['Paul', 'Smith'], ['Simon', 'Says'], ['Steve', 'Brown']]
>>> d = {n[0]: n[1] for n in details}
>>> [list([n[0],d[n[0]]]) for n in rota]
[['Paul', 'Smith'], ['Paul', 'Smith'], ['Steve', 'Brown'], ['Steve', 'Brown'], ['Steve', 'Brown'], ['Simon', 'Says']]
>>>