合并/追加共享公共项的列表
标题可能有点误导,所以在真正的问题出现时,可以随意修改措辞。=)
在这种情况下,我知道列表大部分情况下可以用元组来替代。对我来说,最终结果可以是任何可迭代的东西。
我有两个列表的列表。假设它们是:
list_a = [[1, 'f00d'], [2, 'dead'], [3, 'beef']]
list_b = [[1, 'frankenbeans'], [2, 'chickensoup'], [3, 'spaceballs']]
这两个列表的长度不一定相同,也不能保证它们有一个共同的第一个元素。
我想做的是创建一个新的列表的列表/元组的列表/字典的列表/或者其他什么东西,如下所示:
list_c = [[1, 'f00d', 'frankenbeans'], [2, 'dead', 'chickensoup'], [3, 'beef', 'spaceballs']
更新:
基本上,我知道这些列表中共同的“ID”的位置,虽然它不一定是顺序的,也不保证这些列表的顺序相同(但它是一个整数)。我在寻找一种高效的方法,根据这个共同的ID来创建一个新的子列表集合。
简单的方法:
new_list = []
for list_a_list in list_a:
for list_b_list in list_b:
if list_a_list[0] = list_b_list[0]:
new_list.append([list_a_list[0], list_a_list[1], list_b_list[1]])
...或者类似的东西。这让我觉得有一种更“聪明”的方法可以做到这一点,但我对此不太擅长。
更新:
如果我提到这些列表的列表每次包含成千上万到一百万个项目,这是否会有帮助?
3 个回答
首先,你的输入列表应该是字典:
dict_a = dict(list_a)
dict_b = dict(list_b)
dict_c = dict((k, [v, dict_b[k]]) for k,v in dict_a.items())
如果两个列表中的键不一定都存在,那你就得小心点:
all_keys = set(dict_a.keys()) | set(dict_b.keys())
dict_c = dict((k, (dict_a.get(k), dict_b.get(k))) for k in all_keys)
比如,对于 list_a = [(1, 'a')]
和 list_b = [(1, 'b'), (2, 'c')]
,上面的操作会把 dict_c 设置为 {1: ('a', 'b'), 2: (None, 'c')}
。
itertools.groupby() 这个工具在处理这种任务时非常有用:
from itertools import groupby, chain
from operator import itemgetter
list_a = [[1, 'f00d'], [2, 'dead'], [3, 'beef']]
list_b = [[1, 'frankenbeans'], [2, 'chickensoup'], [3, 'spaceballs']]
combined = [(k, [v[1] for v in g]) for k, g in
groupby(sorted(list_a+list_b), key=itemgetter(0))]
print combined
需要注意的是,在使用 groupby 之前,我们必须先把 list_a 和 list_b 合并成一个新的排序列表,因为 groupby 假设这个列表已经按照关键字排好序了。
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能在使用某个特定的功能时,发现它没有按照预期工作,这时候就需要去寻找解决方案。
通常,我们可以在网上找到很多相关的讨论和解决方案,比如在StackOverflow这样的平台上。这里有很多经验丰富的程序员会分享他们的见解和解决方法,帮助新手解决问题。
在这些讨论中,大家会提到一些代码示例,像
from collections import defaultdict
from itertools import chain
final = defaultdict(list)
for idx, value in chain(l1, l2):
final[idx].append(value)
# and if you have to have a list of lists at the end
finalList = [[k] + v for k, v in final.iteritems()]
这样的占位符就是用来表示代码的地方。通过这些代码示例,初学者可以更直观地理解问题所在,以及如何去解决它。