Python按键压缩
我想合并(zip?)两个元组的python列表,但在一个键上匹配 e、 g.我想创建一个函数,它接受两个输入列表并生成如下输出:Python按键压缩,python,list,Python,List,我想合并(zip?)两个元组的python列表,但在一个键上匹配 e、 g.我想创建一个函数,它接受两个输入列表并生成如下输出: lst1 = [(0, 1.1), (1, 1.2), (2, 1.3), (5, 2.5)] lst2 = [ (1, 4.5), (2, 3.4), (4, 2.3), (5, 3.2)] desiredOutput = [(1, 1.2, 4.5), (2, 1.3, 3.4), (5, 2.5, 3.2)] 我可以用循
lst1 = [(0, 1.1), (1, 1.2), (2, 1.3), (5, 2.5)]
lst2 = [ (1, 4.5), (2, 3.4), (4, 2.3), (5, 3.2)]
desiredOutput = [(1, 1.2, 4.5), (2, 1.3, 3.4), (5, 2.5, 3.2)]
我可以用循环手动完成,但我想一定有一些itertools
/zipping函数可以大大简化这个过程
我确信答案是显而易见的,我只是没有合适的术语来寻找它
==
((无论如何,这是我天真的解决方案。我希望找到更整洁/更具蟒蛇风格的东西:
def key_zipper(lst1, lst2):
dict1 = dict(lst1)
dict2 = dict(lst2)
intersectKeys = [k for k in dict1.keys() if k in dict2.keys()]
output = []
for key in intersectKeys:
output.append((key, dict1[key], dict2[key]))
return output
谢谢)还是有点凌乱,但可以:
def combine(lst1, lst2):
d2 = dict(lst2)
return [(k, v, d2[k]) for (k, v) in lst1 if k in d2]
更新:
如果我真的在生产代码中使用它,我会重构一点:
def dict_intersection(d1, d2):
return [(k,v,d2[k]) for (k,v) in d1.items() if k in d2]
如果是你,我会打电话给你
lst1 = [(0, 1.1), (1, 1.2), (2, 1.3), (5, 2.5)]
lst2 = [(1, 4.5), (2, 3.4), (4, 2.3), (5, 3.2)]
common = dict_intersection(dict(lst1), dict(lst2))
@Vincent的答案也是一个很好的变体。将第二个列表转换为字典,然后您可以检查键是否存在,而无需重复整个第二个列表:
>>> [(i, a, b) for i, a in lst1 for j, b in lst2 if i==j]
[(1, 1.2, 4.5), (2, 1.3, 3.4), (5, 2.5, 3.2)]
def func(lst1,lst2):
d2 = dict(lst2)
return [(k,a,d2[k]) for (k,a) in lst1 if d2.has_key(k) ]
使用和的解决方案:
merge
和groupby
都需要对输入进行排序。如果列表不总是排序,则需要确保这样做:
def key_zipper(*lst):
for k, v in groupby(merge(*map(sorted, lst)), itemgetter(0)):
yield (k,) + tuple(map(itemgetter(1), v))
它的优点是可以处理任意数量的输入列表,并且对于大型列表有更好的运行时
请注意,在这里,我将其编写为生成元组的生成器,而不是返回元组列表的函数,但将其转换为列表非常简单。输出中的子元素需要是元组吗?使用列表会容易得多。@DanielRoseman如果你可以使用列表,我当然可以使用它。谢谢-这是我工作的一个更简洁的版本(我刚刚在问题中发布),从复杂性的角度来看,这比我的答案要好得多,因为d2中的k有字典查找
。此外,您还可以使用[(k,v,d2[k])来表示d1中的k,v。items()如果d2中的k]
来保存查找。您也根本不需要d1。我不知道使用多个表示s的列表理解-我想我喜欢it@jlb83为了提高效率,如果可行,最好避免嵌套For
循环;正如这里的其他答案所示,在这种情况下,可以避免它们。m长循环中的n长循环是O(n*m);非嵌套算法是O(n+m)。显然,即使n&m的价值不高,也能节省大量资金。
def key_zipper(*lst):
for k, v in groupby(merge(*map(sorted, lst)), itemgetter(0)):
yield (k,) + tuple(map(itemgetter(1), v))