Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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_Python 3.x - Fatal编程技术网

Python 从元组列表创建元组列表

Python 从元组列表创建元组列表,python,python-3.x,Python,Python 3.x,我有4张单子 l1 = [('x',20),('y',10),('z',40)] l2 = [('x',30),('r',90),('z',10),('s',20)] l3 = [('y',20),('z',40),('x',39)] l4 = [('s',10),('p',20),('z',20)] 从上面的列表中,我想得到第五个列表 l_final = [('x',39),('y',20),('z',40),('r',90),('s',20),('p',20)] 其中,元组中的所有值

我有4张单子

l1 = [('x',20),('y',10),('z',40)]
l2 = [('x',30),('r',90),('z',10),('s',20)]
l3 = [('y',20),('z',40),('x',39)]
l4 = [('s',10),('p',20),('z',20)]
从上面的列表中,我想得到第五个列表

l_final  = [('x',39),('y',20),('z',40),('r',90),('s',20),('p',20)] 
其中,元组中的所有值都是最大值,即在l_最终列表中,元组('x',39)39中的值是x相关元组的最大值

此外,我能够解决多达2个列表。但无法为5个列表执行此操作。 此外,还建议其他解决方法

我将我的代码添加到这里的2个列表代码中

l1 = [('x',142),('y',523),('r',278),('p',5)]
l2 = [('r',156),('y',663),('s',145),('x',867)]

mylist = []
for i in l1:
    flag = False
    for j in l2:
             if i[0]== j[0]:
                flag = True
                max1 = max(i[1],j[1])
                mylist.append((i[0],max1))
    if flag == False:
        mylist.append((i[0],i[1]))
        flag = True


for i in l2:
    flag = False
    for j in mylist:
        if i[0] == j[0]:
            flag = True
    if flag == False:
         mylist.append((i[0],i[1]))
我的列表现在是:
[('p',20),('s',20),('r',90),('y',20),('x',39),('z',40)]

如果您需要按照您给我们的顺序使用,请更改最后一行:

mylist = [(k, max(d[k])) for k in 'xyzrsp']

[('x', 39), ('y', 20), ('z', 40), ('r', 90), ('s', 20), ('p', 20)]

假设所有的数字都是正数

import collections

l1 = [('x',20),('y',10),('z',40)]
l2 = [('x',30),('r',90),('z',10),('s',20)]
l3 = [('y',20),('z',40),('x',39)]
l4 = [('s',10),('p',20),('z',20)]

d = collections.defaultdict(int)

for k,v in l1 + l2 + l3 + l4:
   if d[k] < v: d[k] = v

result = list(d.iteritems())

刚刚把它搅起来。你应该做你想做的。尝试添加第5个列表并运行它:

def maxmerge(d1, d2):
    for k in d2.keys():
        if not d1.has_key(k):
            d1[k] = d2[k]
        elif d2[k] > d1[k]:
            d1[k] = d2[k]

def maxtup(*lists):
    r = dict()
    for l in lists:
        maxmerge(r, dict(l))
    return r.items()

l1 = [('x',20),('y',10),('z',40)]
l2 = [('x',30),('r',90),('z',10),('s',20)]
l3 = [('y',20),('z',40),('x',39)]
l4 = [('s',10),('p',20),('z',20)]
print maxtup(l1,l2,l3,l4)

假设最终列表的顺序无关紧要

从内置dict类型的文档中:

dict(seq) -> new dictionary initialized as if via:
    d = {}
    for k, v in seq:
        d[k] = v
因此,如果我们使用多个相等的键进行初始化,则
seq
中的最后一个键将优先

我们可以通过将列表合并成一个列表,按数值的递增顺序排序,然后构建字典来利用这一点

因此,整个事件是一个非常短的一行:

dict(sorted(l1+l2+l3+l4, key=lambda x:x[1])).items()

(或者,如果愿意,请使用
操作符.itemgetter
实现该键。)

注意,当所有值都为负值时,此操作将失败。是的。我在回答中加了一条警告。谢谢请参阅我关于@CatPlusPlus答案的lambda建议。设置输出键顺序的灵活性很好。我也不介意使用
setdefault
;我觉得很多人都太快了,无法接触到
集合。defaultdict
。不过,我更喜欢我的基本方法。你可以用一个简单的lambda替换Minimum:
values=collections.defaultdict(lambda:-sys.maxint)
@PaulMcGuire:这不一样。Python整数是任意精度的,
sys.maxint
是在不切换机器整数的情况下可以表示的最大整数。这是一个不错的技巧,但可读性不强。序列位中的最后一个是实现细节,很可能需要人们阅读dict构造函数语义来理解它。。
def maxmerge(d1, d2):
    for k in d2.keys():
        if not d1.has_key(k):
            d1[k] = d2[k]
        elif d2[k] > d1[k]:
            d1[k] = d2[k]

def maxtup(*lists):
    r = dict()
    for l in lists:
        maxmerge(r, dict(l))
    return r.items()

l1 = [('x',20),('y',10),('z',40)]
l2 = [('x',30),('r',90),('z',10),('s',20)]
l3 = [('y',20),('z',40),('x',39)]
l4 = [('s',10),('p',20),('z',20)]
print maxtup(l1,l2,l3,l4)
dict(seq) -> new dictionary initialized as if via:
    d = {}
    for k, v in seq:
        d[k] = v
dict(sorted(l1+l2+l3+l4, key=lambda x:x[1])).items()