按原列表顺序拆分字符串列表
我想做一件有点复杂的事情,但不太确定怎么做比较好。
我有一个二维数组,它的结构像是一个嵌套的列表。列表中的每一“行”都有以下的结构:
['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']]