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']]