My Pojedyncze wejście , podane jako string to lista list kanałów, na przykład:

[[("String1", 2), ("String2", 7), ("String3", 12), ("String4", 17), ("String5 ', 21)], [(" String1 ", 10, 10 ) ("Ciąg2", 15), ("String3", 21), ("String4", 24), ("String5 ', 28)], [(" String1 ", 17), (" String2', 17), ("String2", 22 ), ("String3", 29), ("String4", 32), ("String5 ', 36)], [(" String1 ", 22), (" String2', 30), ("String2 ', 30), (" String3 ", 37 ) ("String4 ', 40), (" String5', 45)]]

W rezultacie chcę uzyskać listę wszystkich wartości obok określonych strun, na przykład:

STRING1 = [2, 10, 17, 22]
STRING2 = [7, 15, 22, 30]
STRING3 = [12, 21, 29, 37]
STRING4 = [17, 24, 32, 40]
STRING5 = [21, 28, 36, 45]

Lub do innego formatu, który pozwoli mi łatwo działać na tym wejściu.

-2
Andy 25 czerwiec 2017, 21:55

6 odpowiedzi

Najlepsza odpowiedź

Ponieważ Twoje dane są w formie sznurka, trzeba będzie najpierw przenikać. Można to zrobić za pomocą ast.literal_eval.

import ast
from collections import defaultdict

input_str = """[[('STRING1', 2), ('STRING2', 7), ('STRING3', 12), ('STRING4', 17), ('STRING5', 21)], [('STRING1', 10), ('STRING2', 15), ('STRING3', 21), ('STRING4', 24), ('STRING5', 28)], [('STRING1', 17), ('STRING2', 22), ('STRING3', 29), ('STRING4', 32), ('STRING5', 36)], [('STRING1', 22), ('STRING2', 30), ('STRING3', 37), ('STRING4', 40), ('STRING5', 45)]]"""

data = ast.literal_eval(input_str)
data_dict = defaultdict(list)
for d in data:
    for x, y in d:
        data_dict[x].append(y)


for k in data_dict:
    print(k, '=', data_dict[k])

Wynik:

STRING2 = [7, 15, 22, 30]
STRING4 = [17, 24, 32, 40]
STRING5 = [21, 28, 36, 45]
STRING3 = [12, 21, 29, 37]
STRING1 = [2, 10, 17, 22]
0
cs95 25 czerwiec 2017, 19:14
from itertools import chain
from collections import defaultdict  
d = defaultdict(list)

list(map(lambda x: d[x[0]].append(x[1]), chain(*list_of_lists)))
-3
vZ10 25 czerwiec 2017, 19:09

Przede wszystkim nie można zdefiniować nazw zmiennych w czasie wykonywania, więc słownik w tym przypadku jest najlepszym rozwiązaniem. Użyłem REGEX, aby zidentyfikować słowa na łańcuchu, a następnie wstawić go na dict of List Structure. Rozwiązanie jest następujące:

import re


s = """"[[('STRING1', 2), ('STRING2', 7), ('STRING3', 12), ('STRING4', 17), ('STRING5', 21)], 
        [('STRING1', 10), ('STRING2', 15), ('STRING3', 21), ('STRING4', 24), ('STRING5', 28)], 
        [('STRING1', 17), ('STRING2', 22), ('STRING3', 29), ('STRING4', 32), ('STRING5', 36)], 
        [('STRING1', 22), ('STRING2', 30), ('STRING3', 37), ('STRING4', 40), ('STRING5', 45)]]"""


data = dict()

pattern = re.compile("\('([^,']+)',[ ]*([0-9]+)\)")

regex = re.findall(pattern, s, flags=0)

if regex:
    for (k, v) in regex:
        if k not in data:
            data[k] = []
        data[k] += [int(v)]

print(data)
-1
garciparedes 25 czerwiec 2017, 19:34

Czy to pomoże?

data = [[('STRING1', 2), ('STRING2', 7), ('STRING3', 12), ('STRING4', 17), ('STRING5', 21)], [('STRING1', 10), ('STRING2', 15), ('STRING3', 21), ('STRING4', 24), ('STRING5', 28)], [('STRING1', 17), ('STRING2', 22), ('STRING3', 29), ('STRING4', 32), ('STRING5', 36)], [('STRING1', 22), ('STRING2', 30), ('STRING3', 37), ('STRING4', 40), ('STRING5', 45)]]
data_dict = {}
for row in data:
  for key, value in row:
    data_dict[key] = data_dict.get(key, []) + [value]

Jeśli chcesz ustawić zmienne za pomocą ciągów jako nazwy, możesz spróbować

for key, value in data_dict.items():
  vars()[key] = value
-1
IJK 25 czerwiec 2017, 19:07

Możesz użyć ast.literal_eval do Parse lista dosłowny w obiekcie listy. Wtedy można użyć collections.defaultdict() do gromadzenia Wartości z Ktoczków:

>>> L = ast.literal_eval(s)
>>> d = defaultdict(list)
>>> for lst in L:
...     for t in lst:
...         d[t[0]].append(t[1])
... 
>>> for k, v in d.items():
...     print(k, v)
... 
STRING1 [2, 10, 17, 22]
STRING2 [7, 15, 22, 30]
STRING3 [12, 21, 29, 37]
STRING4 [17, 24, 32, 40]
STRING5 [21, 28, 36, 45]
0
Eugene Yarmash 25 czerwiec 2017, 19:09

Jeśli STRING1 STRING2 są w tych samych wskaźnikach na każdej liście, możesz spróbować użyć zip.

x = ([('STRING1', 2), ('STRING2', 7), ('STRING3', 12), ('STRING4', 17), ('STRING5', 21)], 
     [('STRING1', 10), ('STRING2', 15), ('STRING3', 21), ('STRING4', 24), ('STRING5', 28)], 
     [('STRING1', 17), ('STRING2', 22), ('STRING3', 29), ('STRING4', 32), ('STRING5', 36)], 
     [('STRING1', 22), ('STRING2', 30), ('STRING3', 37), ('STRING4', 40), ('STRING5', 45)])

for items in zip(*x):
    values = [item[1] for item in items]
    print values

# [2, 10, 17, 22]
# [7, 15, 22, 30]
# [12, 21, 29, 37]
# [17, 24, 32, 40]
# [21, 28, 36, 45]
0
kiran.koduru 25 czerwiec 2017, 19:02