Python 从元组列表创建元组列表
我有4张单子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)] 其中,元组中的所有值
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()