python - 按值加入列表

标签 python performance list for-loop dictionary

有没有一种有效的方法可以根据公共(public)值合并 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)

返回:

[(9, 'John', 'Smith', 'Builder'), (11, 'Bob', 'Dobbs', 'Baker'), (14, 'Joe', 'Bloggs', 'Candlestick Maker')]

虽然此代码对于小型列表工作得很好,但对于包含数百万条记录的较长列表,它的速度令人难以置信慢。有没有更有效的写法?

编辑第一列中的数字是唯一的。

编辑 稍微修改了@John Kugelman 的代码。添加了一个 get(),以防 names 字典在 occupation 字典中没有匹配的键:

>>>> 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')}

最佳答案

使用字典而不是平面列表。

names = {
    9:  ("John", "Smith"),
    11: ("Bob", "Dobbs"),
    14: ("Joe", "Bloggs")
} 

jobs = {
    9:  "Builder",
    11: "Baker",
    14: "Candlestick Maker"
}

如果你需要将它们转换成这种格式,你可以这样做:

>>> {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'}

然后将两者合并是小菜一碟。

names_and_jobs = {id: names[id] + (jobs[id],) for id in names}

关于python - 按值加入列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30631967/

相关文章:

python - python中的Azure函数代码如何打印https请求的数据帧

python - 迭代嵌套列表中的值

python - 如何每 4 秒更新一次 tkinter 窗口?

php - 如何优化 MySQL 游戏排行榜 - 大量子查询问题

c - 如何优化这段代码?

list - TCL - 将字符串按任意数量的空格拆分为列表

C# 将 linq 列表 (int) 项更改为 (string)

python - 如何解决基于深度学习的超分辨率中输入补丁引起的棋盘问题?

c# - volatile 关键字用法与锁

c# - 列表属性 setter