查找子字符串在列表中匹配的每个匹配项并创建单个字符串

时间:2017-05-11 20:04:52

标签: python list

我有一个数组,其中列表的每一行都采用以下格式     元素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个项目。不理想,肯定不是很快。

我有没有想到更好的解决方案?

3 个答案:

答案 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并不完美。但订单对我来说并不重要。