我有两个元组列表
t1 = [ ('a',3,4), ('b',3,4), ('c',4,5) ]
t2 = [ ('a',4,6), ('c',3,4), ('b',3,6), ('d',4,5) ]
这样
我的目标是比较两个列表,如果字符串元素匹配,则比较元组中的最后一个整数元素,并返回包含-1的列表,如果t1 [2]< t2 [2],如果它们相等则为0;如果它们大于,则为1。
我尝试过不同的变化,但我遇到的问题是找到一种方法来匹配字符串以进行适当的比较。
return [diff_unique(x[2],y[2]) for x,y in zip(new_list,old_list) ]
diff_unique执行前面提到的整数比较,new_list是t1,old_list是t2。
我也试过这个:
return [diff_unique(x[2],y[2]) for x,y in zip(new_list,old_list) if(x[0]==y[0]]
我打算做的是使用返回的列表并创建一个新的四元组列表,其中包含原始t1值以及与匹配的t2元组的差异。即
inc_dec_list = compare_list(new,old)
final_list = [ (f,r,u,chge) for (f,r,u), chge in zip(new,inc_dec_list)]
其中new = t1且old = t2。这可能是一个重要的细节,对不起,我错过了。
在正确的方向上有任何帮助吗?
编辑:我添加了我的测试用例程序,模仿了我想要帮助的人的原始意图。谢谢大家。
import os
import sys
old = [('a',10,1),('b',10,2),('c',100,4),('d',200,4),('f',45,2)]
new = [('a',10,2),('c',10,2),('b',100,2),('d',200,6),('e',233,4),('g',45,66)]
def diff_unique(a,b):
print "a:{} = b:{}".format(a,b)
if a < b:
return -1
elif a==b:
return 0
else:
return 1
def compare_list(new_list, old_list):
a = { t[0]:t[1:] for t in new_list }
b = { t[0]:t[1:] for t in old_list }
common = list( set(a.keys())&set(b.keys()))
return [diff_unique(a[key][1], b[key][1]) for key in common]
#get common tuples
#common = [x for x,y in zip(new_list,old_list) if x[0] == y[0] ]
#compare common to old list
#return [diff_unique(x[2],y[2]) for x,y in zip(new_list,old_list) ]
inc_dec_list = compare_list(new,old)
print inc_dec_list
final_list = [ (f,r,u,chge) for (f,r,u), chge in zip(new,inc_dec_list)]
print final_list
答案 0 :(得分:2)
要按不同列表中的字符串匹配元组,可以使用dict理解(保留元组内的顺序):
let array:Array = ["apple", "watermelon", "peach", "pear"]
search(array, "w","m","l")
//Prints
"watermelon"
然后你可以迭代两个词典的键并进行比较。假设您只想对a = {t[0]:t[1:] for t in t1} # {'a': (3, 4), 'c': (4, 5), 'b': (3, 4)}
b = {t[0]:t[1:] for t in t1} # {'a': (4, 6), 'c': (3, 4), 'b': (3, 6), 'd': (4, 5)}
和 t1
中的键/元组进行比较,您可以使用集合加入键:
t2
最后比较字典的项目并创建你想要的列表:
common_keys = list(set(a.keys())&set(b.keys()))
如果您需要按字母顺序排序的字符顺序输出,请使用键上的return [diff_unique(a[key][1],b[key][1]) for key in common_keys ]
功能:
sorted
如果您想要考虑所有密钥,可以执行以下操作:
return [diff_unique(a[key][1],b[key][1]) for key in sorted(common_keys) ]
有关应以什么顺序返回哪些值的新信息,解决方案将是:
all_keys = list(set(a.keys()+b.keys()))
l = list()
for key in sorted(all_keys):
try:
l.append(diff_unique(a[key][1],b[key][1]))
except KeyError:
l.append("whatever you want")
return l
答案 1 :(得分:1)
首先,从每个列表构建一个default dictionary,其中不存在的键的默认值是一个元组,其最后一个元素是比较的最小可能值。
SMALL = (-float['inf'],)
from collections import defaultdict
d1 = defaultdict(lambda: SMALL, [(t[0], t[1:]) for t in t1])
d2 = defaultdict(lambda: SMALL, [(t[0], t[1:]) for t in t2])
接下来,迭代每个字典中的键(可以使用itertools.chain
轻松创建)。您可能希望对结果列表的键进行排序以具有任何意义(否则,您如何知道哪些键生成了哪个-1/0/1?)
from itertools import chain
all_keys = set(chain(d1, d2))
result = [cmp(d1[k][-1], d2[k][-1]) for k in sorted(all_keys)]
答案 2 :(得分:0)
以下是您问题的简单解决方案, 你试过的不是一行。我希望它仍然会帮助你
for a in t1:
for b in t2:
if a[0] != b[0]:
continue
return cmp(a[-1], b[-1])
答案 3 :(得分:0)
在python 3.x
中,您可以比较两个元组列表
a
和b
这样:
import operator
a = [(1,2),(3,4)]
b = [(3,4),(1,2)]
# convert both lists to sets before calling the eq function
print(operator.eq(set(a),set(b))) #True