簡體   English   中英

將列表列表中的元組字符串轉換為Python中的列表項

[英]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文件是什么樣子!)

  1. 建立列表是否需要規范化的“測試”(下面的is_tuple_string_row函數)。
  2. 使用ast.literal_eval將元組字符串安全地轉換為實際的元組。
  3. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM