我有一个像这样的字符串列表
list1 = ["['First Standard', 'First Flex', 'Business Standard']", "
['P,F', 'A', 'C,D,F,G']"]
我希望将其重新格式化为:
list2 = ["['First Standard','P','F']", "['First Flex','A']", "['Business
Standard','C','D','F','G']"]
答案 0 :(得分:1)
如果要处理相关数据的并行集合,zip
函数很有用。
a=[1,2,3]
b=[4,5,6]
zip(a,b)
> [(1,4), (2,5), (3,6)]
此外,您可以ast.literal_eval
从这些字符串中获取列表。
ast.literal_eval("[1,2,3]")
> [1,2,3]
将此应用于您的案例:
data = ["['First Standard', 'First Flex', 'Business Standard']", "['P,F', 'A', 'C,D,F,G']"]
result = [[x] + y.split(",") for (x,y) in zip(ast.literal_eval(data[0]),ast.literal_eval(data[1]))]
您也可以将此数据视为有效的json并使用此功能。
import json
result = [[x] + y.split(",") for (x,y) in zip(json.loads(data[0]),json.loads(data[1]))]
答案 1 :(得分:1)
如果你想避免使用eval表达式(出于安全原因我强烈建议),你可以使用正则表达式来实现。如评论中所述,如果您的数据包含嵌套的单引号,则需要更改此内容。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import re
start_list = [
"['First Standard', 'First Flex', 'Business Standard']",
"['P,F', 'A', 'C,D,F,G']"
]
pattern = "'(.*?)'"
new_list = []
for stringsInList in start_list:
words = re.findall(pattern, stringsInList)
new_list.append(words)
final = [(a, b) for a, b in zip(new_list[0], new_list[1])]
print(final)
#[('First Standard', 'P,F'), ('First Flex', 'A'), ('Business Standard', 'C,D,F,G')]
编辑 - 略微更精简
start_list = [
"['First Standard', 'First Flex', 'Business Standard']",
"['P,F', 'A', 'C,D,F,G']"
]
new_list = [re.findall("'(.*?)'", x) for x in start_list]
final = [(a, b) for a, b in zip(new_list[0], new_list[1])]
print(final)