【问题标题】:python compare values of the sublists of a list and add up valuespython比较列表的子列表的值并将值相加
【发布时间】:2013-06-15 21:25:33
【问题描述】:

我有一个包含未知数量子列表的列表。 我想始终将一个子列表与 ALL 其他子列表进行比较。 如果位置 0、3 和 5 的第一个子列表的值等于任何其他子列表,我想将所有匹配列表中位置 7 的值加在一起。 然后将位置 7 处的(新加值)的第一个子列表添加到新列表中。

list = [['A', 'a', 'b', 'B', 'c', 'd', 'C', '1'], 
         ['A', 'a', 'b', 'B', 'c', 'd', 'C', '3'], 
         ['D', 'r', 's', 'E', 't', 'u', 'F', '2'], 
         ['A', 'a', 'b', 'B', 'c', 'd', 'C', '2'], 
         ['D', 'r', 's', 'E', 't', 'u', 'F', '2'],.....]

想要的输出:

new_list = [['A', 'a', 'b', 'B', 'c', 'd', 'C', '6'], 
             ['D', 'r', 's', 'E', 't', 'u', 'F', 4],...]

我写了这段代码

def Inter(list):
a = 0
b = 3 
c = 5 
d = 0
x = [] 

for i in range(len(list)): 
    for y in range(len(list)):
        if list[i][a] == list[y][a] and list[i][b] == list[y][b] and list[i][c] == list[y][c]: 
            IntSumtemp = []
            IntSumtemp.append(str(float(list[i][7]) + float(list[y][7])))
            x.append(list[i] + IntSumtemp) 
            del (x[d][7])
            d +=1
        else: None
return x
new_list= Inter(list)

但它给出了这个输出:

new_list= [['A', 'a', 'b', 'B', 'c', 'd', 'C', '2.0'], 
       ['A', 'a', 'b', 'B', 'c', 'd', 'C', '4.0'], 
       ['A', 'a', 'b', 'B', 'c', 'd', 'C', '3.0'], 
       ['A', 'a', 'b', 'B', 'c', 'd', 'C', '4.0'], 
       ['A', 'a', 'b', 'B', 'c', 'd', 'C', '6.0'], 
       ['A', 'a', 'b', 'B', 'c', 'd', 'C', '5.0'], 
       ['D', 'r', 's', 'E', 't', 'u', 'F', '4.0'], 
       ['D', 'r', 's', 'E', 't', 'u', 'F', '4.0'], 
       ['A', 'a', 'b', 'B', 'c', 'd', 'C', '3.0'], 
       ['A', 'a', 'b', 'B', 'c', 'd', 'C', '5.0'], 
       ['A', 'a', 'b', 'B', 'c', 'd', 'C', '4.0'], 
       ['D', 'r', 's', 'E', 't', 'u', 'F', '4.0'],
       ['D', 'r', 's', 'E', 't', 'u', 'F', '4.0']]

有人可以帮我解决这个问题吗? (对不起,我是初学者,如果有什么不清楚的地方,请问...)

【问题讨论】:

    标签: python list


    【解决方案1】:

    这种方法是 O(N),而你的方法是 O(N^2)

    from collections import OrderedDict
    from operator import itemgetter
    
    items = [['A', 'a', 'b', 'B', 'c', 'd', 'C', '1'], 
             ['A', 'a', 'b', 'B', 'c', 'd', 'C', '3'], 
             ['D', 'r', 's', 'E', 't', 'u', 'F', '2'], 
             ['A', 'a', 'b', 'B', 'c', 'd', 'C', '2'], 
             ['D', 'r', 's', 'E', 't', 'u', 'F', '2']]
    
    
    key = itemgetter(0, 3, 5)
    d = OrderedDict()
    
    for x in items:
        d.setdefault(key(x), x[:7] + [0])[7] += int(x[7])
    
    print d.values()
    

    [['A', 'a', 'b', 'B', 'c', 'd', 'C', 6], ['D', 'r', 's', 'E', 't', 'u', 'F', 4]]
    

    【讨论】:

    • +1 表示可读的两行。关于一切如何运作的一个小解释可能会很好,因为 OP 是初学者。
    • 谢谢!你能解释一下这是如何工作的吗?我想用它来解决一个非常相似的问题,我有 2 个单独的列表(带有子列表)来比较子列表而不是只有 1 个列表...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多