Строка в список (Python) - PullRequest
       4

Строка в список (Python)

0 голосов
/ 10 марта 2020
cfgFile = { 'pers' : 20, 'source' : '[[3,"COUNTCOL","int"],[4,"COUNTROW","int"], [6,"ROWHEADER","int"],[2,"ROWCOUNT","int"]]'}

данные могут отличаться в разы:

cfgFile = {'pers': 20,
           'source': '[[3,"COUNTCOL","float",2],[4, "COUNTROW", "int"],[7, "ROWHEADER", "int"],[8, "ROWHEADER", "float",2]]'}

'source' в вышеприведенном словаре - это список списка в виде строки, вложенной в словарь cfgFile.

Я пытаюсь получить доступ к самому первому индексу в каждом из вложенных списков, чтобы создать другой список.


sourceString = cfgFile.get('source')
sourceList = list(sourceString[1:-1])

print(sourceList)

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

В зависимости от того, что вы хотите сделать с информацией из вашего журнала, вы можете создать свой собственный анализатор, вот пример того, как вы можете выполнить синтаксический анализ:

from itertools import repeat

def get_list(v):
    n = (int(e.group()) for e in re.finditer(r'\d', v))
    s = (e.group(1) for e in re.finditer(r'\d, ([A-Z]+),', v))

    return list(list(e) for e in zip(n, s , repeat('int')))

sourceString = cfgFile.get('source')
sourceList = get_list(sourceString)[1:-1]
print(sourceList)

output:

[[4, 'COUNTROW', 'int'], [6, 'ROWHEADER', 'int']]

так как вы изменили cfgFile в своем вопросе, вы можете использовать ast.literal_eval:

from ast import literal_eval


literal_eval(sourceString)

sourceString = cfgFile.get('source')
sourceList = literal_eval(sourceString)[1:-1]

print(sourceList)

выход:

[[4, 'COUNTROW', 'int'], [7, 'ROWHEADER', 'int']]
0 голосов
/ 10 марта 2020
import re

cfgFile = { 'pers' : 20, 'source' : '[[3, COUNTCOL, int], [4, COUNTROW, int], [6, ROWHEADER, int], [2, ROWCOUNT, int]]' }

l = cfgFile.get("source").split(",")
[re.sub("\[*", "", l[i]) for i in range(len(l)) if i % 3 == 0]
#['3', ' 4', ' 6', ' 2']
...