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

Python 用于连接列表中类似列表的循环

Python 用于连接列表中类似列表的循环,python,list,loops,for-loop,concatenation,Python,List,Loops,For Loop,Concatenation,我编写了一个循环来比较列表列表。如果它找到两个相似的列表,它将对其中一个字符串求和,并删除第二个列表。有没有办法让它更正确 输入列表: someList = [['abc', 'def', 10, 'ghi'], ['abc', 'def', 50, 'ghi'], ['jkl', 'mno', 20, 'pqr']] 代码: a = 0 for i in range(len(someList)): for k in range(len(someList)): if s

我编写了一个循环来比较列表列表。如果它找到两个相似的列表,它将对其中一个字符串求和,并删除第二个列表。有没有办法让它更正确

输入列表:

someList = [['abc', 'def', 10, 'ghi'], ['abc', 'def', 50, 'ghi'], ['jkl', 'mno', 20, 'pqr']]
代码:

a = 0
for i in range(len(someList)):
    for k in range(len(someList)):
        if someList[i] != someList[k]:
            if someList[i][0] == someList[k][0]:
                if someList[i][1] == someList[k][1]:
                        if someList[i][4] == someList[k][4]:
                            someList[i][2] = someList[i][2] + someList[k][2]
                            someList[k][4] = 'lalala'
                            a = k
del someList[a]
所需的输出列表为:

someList = [['abc', 'def', 60, 'ghi'], ['jkl', 'mno', 20, 'pqr']]

这段代码很有效,但我认为写得很糟糕。此外,如果列表中只有两个类似的子列表,它也可以工作。

我会使用临时查找映射:

someList = [['abc', 'def', 10, 'ghi'], ['abc', 'def', 50, 'ghi'], ['jkl', 'mno', 20, 'pqr']]

lookup_map = {}
for e1, e2, e3, e4 in someList:
    key = (e1, e2, e4)
    if key in lookup_map:
        lookup_map[key][2] += e3
    else:
        lookup_map[key] = [e1, e2, e3, e4]

print(lookup_map.values())
# [['jkl', 'mno', 20, 'pqr'], ['abc', 'def', 60, 'ghi']]
在O(N)时间内完成。如果需要保留顺序,请使用
collections.OrderedDict
进行
查找\u映射
。此外,如果只存储键,并将第三个元素的值增加为如下值,则内存效率会更高:

import collections

someList = [['abc', 'def', 10, 'ghi'], ['abc', 'def', 50, 'ghi'], ['jkl', 'mno', 20, 'pqr']]

lookup_map = collections.defaultdict(int)
for e1, e2, e3, e4 in someList:
    lookup_map[e1, e2, e4] += e3

# but now we need to unpack it back into a list:
result = [[e1, e2, v, e3] for (e1, e2, e3), v in lookup_map.items()]
# [['jkl', 'mno', 20, 'pqr'], ['abc', 'def', 60, 'ghi']]
或者,如果您不想使用
collections.defaultdict
(您应该这样做,对于较大的数据集,它会更快):


阅读代码时,它会在同一个列表上迭代两次,并将每个元素相互比较?这个列表是二维的吗?不清楚代码试图做什么,因此可能会显示一个示例输入列表和代码所需的输出。@danny好的,我更正了帖子。子列表“相似”的原因是什么?@zwer等于项[0]、[1]和[3](除了[2])
someList = [['abc', 'def', 10, 'ghi'], ['abc', 'def', 50, 'ghi'], ['jkl', 'mno', 20, 'pqr']]

lookup_map = {}
for e1, e2, e3, e4 in someList:
    key = (e1, e2, e4)
    lookup_map[key] = lookup_map.get(key, 0) + e3

# but now we need to unpack it back to a list:
result = [[e1, e2, v, e3] for (e1, e2, e3), v in lookup_map.items()]
# [['jkl', 'mno', 20, 'pqr'], ['abc', 'def', 60, 'ghi']]