我有一个数组,其中列表的每一行都采用以下格式 元素1 [tab] Element2 [tab]元素3 [tab]元素4 [eol]
每行的前3个元素在列表中可以有多个实例,例如:
11333[tab]55555[tab]EG[tab]455565[EOL]
11332[tab]55555[tab]EG[tab]455563[EOL]
11333[tab]55555[tab]EG[tab]455562[EOL]
每行的最后一个元素是可变的。我想要做的是重复删除列表并获取欺骗行的最后一个元素,并将它们连接在一起,并在它们之间加上一个字符,如: 11333 [标签] 55555 [标签] EG [标签] 455565,455562 [EOL] 11332 [标签] 55555 [标签] EG [标签] 455565 [EOL]
为了让我实现这一点,我基本上必须在这两个列表之间进行迭代:
new_list = []
last_column = ""
for element in list1:
for otherelement in list 2:
if last_column == "" :
last_column += otherelement[3]
else:
last_column += "," + otherelement[3]
new_list.append(element.split(" ")[0:2] + " " + last_column)
不是逐字逐句,但它让你知道我在做什么。 现在请记住,这些列表中的每一个通常每个都至少有10,000行,这意味着对于第一个列表中的每个项目,都会检查另一个列表中的所有10,000个项目。不理想,肯定不是很快。
我有没有想到更好的解决方案?
答案 0 :(得分:0)
为了收集和分组数据,defaultdict
似乎是一个很好的选择。请参阅下面的示例。
from collections import defaultdict
data = [
[1, 1, 1, 'a'],
[1, 1, 1, 'b'],
[1, 1, 2, 'c'],
[2, 1, 1, 'd'],
]
accumulator = defaultdict(list)
for row in data:
# use a tuple of the first three elements as the key
# append the fourth element to a list tracking the values
accumulator[tuple(row[:-1])].append(row[-1])
print accumulator
# defaultdict(<type 'list'>, {(1, 1, 1): ['a', 'b'], (2, 1, 1): ['d'], (1, 1, 2): ['c']})
将数据放入此示例中使用的表单应该很容易,获得所需的输出应该与此相反。
答案 1 :(得分:0)
使用您的实际数据扩展上一个答案:
from collections import defaultdict
data = [
"11333 55555 EG 455565",
"11332 55555 EG 455563",
"11333 55555 EG 455562"
]
vars_by_common = defaultdict(list)
for d in data:
parts = d.split("\t")
common = tuple(parts[:3]) # so it can be a key in a dict
var = parts[3]
vars_by_common[common].append(var)
# now rebuild list
new_data = []
for c, v in vars_by_common.items():
new_data.append("\t".join(c) + "\t" + ",".join(v))
print(new_data)
答案 2 :(得分:0)
谢谢大家!使用defaultdict的解决方案要快得多。我从来没有采取过正式的时间表,但是使用我的解决方案的运行花了6秒钟,现在我看了大约一秒,也许更少。当要追加的变量项数量变得更大时(显然),这显示出明显的改善。
唯一的缺点就是失去秩序,因为我认为dicts并不完美。但订单对我来说并不重要。