按原列表顺序拆分字符串列表

1 投票
6 回答
1538 浏览
提问于 2025-04-17 09:49

我想做一件有点复杂的事情,但不太确定怎么做比较好。

我有一个二维数组,它的结构像是一个嵌套的列表。列表中的每一“行”都有以下的结构:

['171000', 'Thing..Mega~Corporate~Thing..Mid~Dairy~Thing..Micro~Cheese', 'Cheese', '0.012174']

我想做的是逐行遍历整个数组,然后创建一个新行,把第二个位置的字符串分成三个新的字符串,这样结果就变成了:

['171000', 'Mega~Corporate', 'Mid~Dairy', 'Micro~Cheese', 'Cheese', '0.012174']

有几件事我需要提到。在上面的例子中,我把字符串分成了三个部分,分别是 Mega、Mid 和 Micro。但并不是每个字符串都有“Mid”和“Micro”这两个部分。有些字符串可能只是这个格式的简短版本:

'Thing..Mega~Corporate'

在这种情况下,我想插入一个占位符,以保持数组中每个元素的位置(这样最终位置的数字总是有相同的索引)。

我正在处理的数组相当大,有超过10万行。任何帮助都将非常感激,因为我在这方面真的很挣扎。

6 个回答

0

我觉得我不太明白这个问题... 但希望这能给你一些提示:

l = ['171000', 'Mega~Corporate~Thing..Mid~Dairy~Thing..Micro~Cheese', 'Cheese', '0.012174']

strs = l[1].split('..')
l = [l[0]] + strs + l[2:]
print l
1

如果你每次都用'..'来分割,然后循环处理这些内容,就可以把所有的东西合并到一个新的列表里。我觉得没有更简单的方法了。不过,速度方面我不是很擅长。

row = ['171000', 'Thing..Mega~Corporate~Thing..Mid~Dairy~Thing..Micro~Cheese', 'Cheese', '0.012174']
new_row = []
for i in row: 
    new_row += i.split('..')

最后的结果是...

['171000', 'Thing', 'Mega~Corporate~Thing', 'Mid~Dairy~Thing', 'Micro~Cheese', 'Cheese', '0.012174']

如果你不想使用额外的变量,另一种方法是用reduce

row = reduce(lambda x, y: x + y.split('..'), row, [])

我不太明白你代码中'Thing'的意义是什么,或者为什么它在输出中没有出现。如果你能解释一下它的规则,我会更新我的回答。

2

如果Thing..代表的是一些任意的文本(而不是字符串中的字面数据):

import re

def explode(s, keywords):
    for k in keywords:
        m = re.search(r'(%s~[^~]*)(?:~|$)' % (re.escape(k),), s)
        yield m and m.group(1)

for row in lst:
    row[1:2] = explode(row[1], "Mega Mid Micro".split())

示例

import re
from pprint import pprint

def explode(s, keywords):
    for k in keywords:
        m = re.search(r'(%s~[^~]*)(?:~|$)' % (re.escape(k),), s)
        yield m and m.group(1)


lst = [
 ['171000', 'Thing..Mega~Corporate~Thing..Mid~Dairy~Thing..Micro~Cheese', 'Cheese', '0.012174'],
 ['171000', 'Thing..Mega~Corporate', 'Cheese', '0.012174'],
]

print("Before:")
pprint(lst)

for row in lst:
    row[1:2] = explode(row[1], "Mega Mid Micro".split())

print("\nAfter:")
pprint(lst)

输出

Before:
[['171000',
  'Thing..Mega~Corporate~Thing..Mid~Dairy~Thing..Micro~Cheese',
  'Cheese',
  '0.012174'],
 ['171000', 'Thing..Mega~Corporate', 'Cheese', '0.012174']]

After:
[['171000',
  'Mega~Corporate',
  'Mid~Dairy',
  'Micro~Cheese',
  'Cheese',
  '0.012174'],
 ['171000', 'Mega~Corporate', None, None, 'Cheese', '0.012174']]

撰写回答