Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List - Fatal编程技术网

Python按键压缩

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)] 我可以用循

我想合并(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)]
我可以用循环手动完成,但我想一定有一些
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))