Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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

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_Tuples - Fatal编程技术网

比较python中元组元素的列表

比较python中元组元素的列表,python,list,tuples,Python,List,Tuples,我有两个元组列表 t1 = [ ('a',3,4), ('b',3,4), ('c',4,5) ] t2 = [ ('a',4,6), ('c',3,4), ('b',3,6), ('d',4,5) ] 以致 元组的顺序可能不相同,并且 列表可能不包含相同数量的元组元素 我的目标是比较这两个列表,如果字符串元素匹配,则比较元组中的最后一个整数元素,并返回一个列表,如果t1[2]

我有两个元组列表

t1 = [ ('a',3,4), ('b',3,4), ('c',4,5) ]
t2 = [ ('a',4,6), ('c',3,4), ('b',3,6), ('d',4,5) ]
以致

  • 元组的顺序可能不相同,并且
  • 列表可能不包含相同数量的元组元素
  • 我的目标是比较这两个列表,如果字符串元素匹配,则比较元组中的最后一个整数元素,并返回一个列表,如果t1[2] 我尝试过不同的变体,但我遇到的问题是找到一种匹配字符串的方法来进行适当的比较

    return [diff_unique(x[2],y[2]) for x,y in zip(new_list,old_list) ]
    
    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])
    
    其中diff_unique对上述整数进行比较,新的_列表为t1,旧的_列表为t2

    我也试过:

    return [diff_unique(x[2],y[2]) for x,y in zip(new_list,old_list) if(x[0]==y[0]]
    
    我打算使用返回的列表,创建一个新的四元组列表,其中包含原始t1值以及与匹配t2元组的差异。i、 e

    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
    
    导入操作系统
    导入系统
    old=[('a',10,1),('b',10,2),('c',100,4),('d',200,4),('f',45,2)]
    新=[('a',10,2),('c',10,2),('b',100,2),('d',200,6),('e',233,4),('g',45,66)]
    def diff_唯一(a、b):
    打印“a:{}=b:{}”。格式(a,b)
    如果a
    首先,从每个列表构建一个,不存在的键的默认值是一个元组,其最后一个元素是比较的最小可能值

    return [diff_unique(x[2],y[2]) for x,y in zip(new_list,old_list) ]
    
    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])
    
    接下来,迭代每个字典中的键(可以轻松创建)。您可能希望对结果列表中的键进行排序,使其具有任何意义(否则,您如何知道哪些键生成了-1/0/1中的哪一个?)


    这是你问题的一个简单解决方案, 这不是你试过的那一行。我希望它仍能帮助你

    for a in t1:
        for b in t2:
            if a[0] != b[0]:
                continue
            return cmp(a[-1], b[-1])
    

    要按不同列表中的字符串匹配元组,可以使用dict理解(保留元组内部的顺序):

    然后您可以迭代两个字典的键并进行比较。假设您只想对
    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 ]
    
    如果需要按字母排序的字符顺序输出,请使用以下键上的
    排序功能:

    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
    

    有了关于应以何种顺序返回哪些值的新信息,解决方案如下:

    ordered_keys = [t[0] for t in t1]
    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)}
    l = list()
    for key in sorted(ordered_keys):
        try:
            l.append(diff_unique(a[key][1],b[key][1]))
        except KeyError:
            l.append(0) # default value
    return l
    

    在Python3.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
    

    你能添加预期的输出吗?@BhargavRao我已经编辑了这篇文章。谢谢你嘿,切普纳,又是一个好答案。然而,这是一个小小的建议。。一定要添加文档的链接,因为它将真正帮助那些不了解
    defaultdict
    chain
    的人。此解决方案不会找到所有匹配的元素,如果当前索引不匹配,它只会关闭。但是,如果b[3]等于a[2],那么我想比较它们。谢谢你,这是我第一次尝试并注意到了这一点。我现在正在测试这个解决方案,它看起来很有希望。结果列表的唯一标准是它与原始(或新列表)的元素平行。您的意思是列表应该按照t1中元组的顺序排序?您想如何处理一个字符不存在元组的情况?假设t1有3个元素,t2有5个元素。如果t1中的所有元素都在t2中找到,则结果列表将分别返回一个列表[1,-1,0]。如果在t2中找不到元素,则默认值为0。因为最后我把列表合并到t1 final_list=[(f,r,u,chge)for(f,r,u),chge in zip(new,inc_dec_list)]好的。我在底部添加了一个新的段落,我认为它保持了你想要的顺序。太棒了,去测试一下。我还添加了我的测试用例脚本,它模仿了我试图完成的任务。非常感谢。