我得到了这两个清单:
A=[[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q']]
B=[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q']]
我希望按字母表比较这两个列表,并将带有最大数字的列表附加到新列表C?
C=[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q'],[12, 'a'], [0, 'c'], [15, 'w'], [5, 'Q']]
编辑:我收到了这段代码,但只输出
C=[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q']]?
C = []
for g1, g2 in zip(a,b):
line = []
for e1, e2 in zip(g1, g2):
line.append(max(e1, e2))
C.append(line)
答案 0 :(得分:1)
首先创建一个包含B
中最大值的字典,注意确保处理列表中任何可能的重复项。然后根据C
中找到的最大值和当前值,使用列表推导创建B
:
A = [[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q']]
B = [[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q']]
max_values = {}
for count, value in B:
try:
max_values[value] = max(max_values[value], count)
except KeyError:
max_values[value] = count
C = [[max(count, max_values[value]), value] for count, value in A]
print C
给你:
[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q'], [12, 'a'], [0, 'c'], [15, 'w'], [5, 'Q']]
在您提供的示例中,B
包含唯一值,但如果同一个字母恰好有多个条目,则此解决方案将确保使用最大值。
答案 1 :(得分:0)
zip
在这种情况下不起作用,因为B
的元素可以在C
中的任何位置使用。 zip
返回的可迭代只有最短列表的元素数。
您需要在A
中保留C
的订单,因此A
应该保留一个列表,但B
应该是一个字典:
>>> A=[[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q']]
>>> B=[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q']]
>>> B = {l[1]:l for l in B}
>>> B
{'a': [12, 'a'], 'c': [0, 'c'], 'w': [15, 'w'], 'Q': [3, 'Q']}
然后,您可以使用列表推导来获取最大值:
>>> [max(l, B[l[1]]) for l in A]
[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q'], [12, 'a'], [0, 'c'], [15, 'w'], [5, 'Q']]