Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并/附加共享公共项的列表_Python - Fatal编程技术网

Python 合并/附加共享公共项的列表

Python 合并/附加共享公共项的列表,python,Python,标题可能具有误导性,因此当出现真正问题的术语时,请随意更改措辞。=) 在这种情况下,我知道列表在很大程度上可以与元组交换。就我而言,最终的结果可能是不可预测的 我有两张名单。假设它们是: list_a = [[1, 'f00d'], [2, 'dead'], [3, 'beef']] list_b = [[1, 'frankenbeans'], [2, 'chickensoup'], [3, 'spaceballs']] 列表的长度不一定相同,也不能保证它们包含公共的第一个元素 我想做的是创建

标题可能具有误导性,因此当出现真正问题的术语时,请随意更改措辞。=)

在这种情况下,我知道列表在很大程度上可以与元组交换。就我而言,最终的结果可能是不可预测的

我有两张名单。假设它们是:

list_a = [[1, 'f00d'], [2, 'dead'], [3, 'beef']]
list_b = [[1, 'frankenbeans'], [2, 'chickensoup'], [3, 'spaceballs']]
列表的长度不一定相同,也不能保证它们包含公共的第一个元素

我想做的是创建一个新的列表/元组列表/dict列表/诸如此类的列表:

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]])
。。。或者类似的。让我觉得有一种更“聪明”的方法可以做到这一点,但我有点不喜欢

更新:

如果我提到列表列表中每个列表一次包含数千到一百万个项目,这会增加任何影响吗?

您的输入列表首先应该是字典:

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()]
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:(无,'c')}
对此类任务有帮助:

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假设列表已经按键排序。

这可能会引发一个KeyError。>>列表的长度不一定相同,也不能保证它们包含公共的第一个元素。@g.d.d.c很好。添加了一个版本,将元组中的元素设置为
None
(如果不存在)。当然,在这些情况下,也可以只使用一个元素构造列表或元组。