[英]Converting strings of tuples within list of lists to list items in Python
列表l
包含由两种类型的列表组成的项目,第一种是可接受的由字符串组成的列表,第二种是包含字符串的元组字符串。 第二种类型的所有列表的长度都相同-2。我想将第二种类型的所有列表转换为与第一种类型相同的约定,如下所示( l2
是更新后的列表)。
编辑:我应该澄清一下,我要处理的实际列表远远超过两个项目,因此我需要一个循环函数来容纳此列表。
l = [["('N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '')", "('61060', '61060')"], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
l2 = [['N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '', '61060', '61060'], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
到目前为止,以下内容仅能帮助我:
from csv import reader
from cStringIO import StringIO
l2 = []
for i in l:
if len(i) == 2:
filestr = StringIO(i[0] + i[1])
csv_reader = reader(filestr, quotechar="'")
for t in csv_reader:
l2.append(t)
else:
l2.append(i)
您可以使用ast:
>>> import ast
>>> l = [["('N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '')", "('61060', '61060')"], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
>>> l2=[e for e in ast.literal_eval(l[0][0])]
>>> l2+=[e for e in ast.literal_eval(l[0][1])]
>>> l2=[l2]
>>> l2.append(l[1])
>>> l2
[['N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '', '61060', '61060'], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
您可能知道, eval
存在一些实际的安全问题。 ast
非常安全,因为它只能生成Python基本数据结构。
如果且仅当您信任输入时,才可以评估它:
l2 = eval(l[0][0])
我不完全了解整个输入的结构,因此无法帮助您遍历所有输入。
这不是csv问题,因为您没有csv。 (实际上您迷惑了一段时间,因为我试图想象csv文件是什么样子!)
is_tuple_string_row
函数)。 ast.literal_eval
将元组字符串安全地转换为实际的元组。 chain.from_iterable
将所有元组合并为一个序列。 下面的完整代码实现为生成器normalized_list()
。
l = [["('N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '')", "('61060', '61060')"], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
l2 = [['N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '', '61060', '61060'], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
import ast
from itertools import imap, chain
def is_tuple_string_row(L):
"""Return whether list L is a list of strings containing tuples"""
return len(L)==2 and all(s.startswith("('") and s.endswith("')") for s in L)
def normalized_list(L):
"""Yield lists in sequence L as lists of strings
Normalizes a list of strings of tuples down to a simple list of strings
"""
for item in L:
if is_tuple_string_row(item):
yield list(chain.from_iterable(imap(ast.literal_eval, item)))
else:
yield item
# You can iterate efficiently
for item in normalized_list(l):
print item
# or you can put the whole thing to a single new list
aslist = list(normalized_list(l))
# verify results
assert aslist == l2
我建议您使用列表而不是元组,然后在必要时为列表/子列表/和列表子列表建立索引,以实现所需的功能。
另一个想法是使您想要的结构成为一类。 放入分割列表的方法。 似乎您想要元组中的前9个项目,而希望在单独的元组中的后两个项目。 这也是将它们分开的好方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.