Jes*_*lly 5 python performance dictionary for-loop list
是否有一种基于公共值在python中合并两个元组列表的有效方法.目前,我正在做以下事情:
name = [
(9, "John", "Smith"),
(11, "Bob", "Dobbs"),
(14, "Joe", "Bloggs")
]
occupation = [
(9, "Builder"),
(11, "Baker"),
(14, "Candlestick Maker")
]
name_and_job = []
for n in name:
for o in occupation:
if n[0] == o[0]:
name_and_job.append( (n[0], n[1], n[2], o[1]) )
print(name_and_job)
Run Code Online (Sandbox Code Playgroud)
收益:
[(9, 'John', 'Smith', 'Builder'), (11, 'Bob', 'Dobbs', 'Baker'), (14, 'Joe', 'Bloggs', 'Candlestick Maker')]
Run Code Online (Sandbox Code Playgroud)
尽管此代码工作完全正常的小名单,这是令人难以置信的对数以百万计的记录更长的名单慢.有没有更有效的方式来写这个?
编辑第一列中的数字是唯一的.
编辑修改了@John Kugelman的代码.添加了一个get(),以防名称字典在职业字典中没有匹配的密钥:
>>>> names_and_jobs = {id: names[id] + (jobs.get(id),) for id in names}
>>>> print(names_and_jobs)
{9: ('John', 'Smith', None), 11: ('Bob', 'Dobbs', 'Baker'), 14: ('Joe', 'Bloggs', 'Candlestick Maker')}
Run Code Online (Sandbox Code Playgroud)
使用词典而不是平面列表.
names = {
9: ("John", "Smith"),
11: ("Bob", "Dobbs"),
14: ("Joe", "Bloggs")
}
jobs = {
9: "Builder",
11: "Baker",
14: "Candlestick Maker"
}
Run Code Online (Sandbox Code Playgroud)
如果您需要将它们转换为此格式,您可以执行以下操作:
>>> {id: (first, last) for id, first, last in name}
{9: ('John', 'Smith'), 11: ('Bob', 'Dobbs'), 14: ('Joe', 'Bloggs')}
>>> {id: job for id, job in occupation}
{9: 'Builder', 11: 'Baker', 14: 'Candlestick Maker'}
Run Code Online (Sandbox Code Playgroud)
然后将两者合并是一块蛋糕.
names_and_jobs = {id: names[id] + (jobs[id],) for id in names}
Run Code Online (Sandbox Code Playgroud)