Создать список из списка кортежей - PullRequest
0 голосов
/ 25 мая 2018

У меня есть список, подобный этому:

mylist = [(20, 'Start', '2008-10-10', 'TBS'),...,(20, 'End', '2008-11-09', 'NG'), 
          (21, 'Start', '2008-12-10', 'TBS'),...,(21, 'End', '2008-12-15', 'G'), 
          (22, 'Start', '2009-01-10', 'TBS'),...,(22, 'End', '2009-12-10', 'B'),..]

Я положил '...' в приведенном выше примере, чтобы сказать, что есть другие элементы для каждого идентификатора, такие как 20, 21 и 22 в списке, но яне хочу ихЕдинственные элементы, которые мне нужны, это элементы, которые включают «Начало» или «Конец». (Другие элементы имеют слова, отличные от этих двух слов.)

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

[[20, 'Start', '2008-10-10', 'End', '2008-11-09', 'NG'] ,
 [21, 'Start', '2008-12-10', 'End', '2008-12-15', 'G'], 
 [22, 'Start', '2009-01-10', 'End', '2009-12-10', 'B']]

Вот мой код:

code = 0
brr = []
for row in myList:
    if row[1] == "Start":
        arr = []
        code = row[0]
        arr.append([row[0], row[1], row[2]])
        continue

    if row[0] == code and row[1] == "End":
        arr.append([row[1], row[2], row[3]])
    brr.append(arr)
for k in brr:
    print(k)

Но проблема в том, что он создает что-то вроде этого:

[[[20, 'Start', '2008-10-10', 'End'], ['2008-11-09', 'NG']] ,
 [[20, 'Start', '2008-10-10', 'End'], ['2008-11-09', 'NG']] ,
 [[20, 'Start', '2008-10-10', 'End'], ['2008-11-09', 'NG']] ,
 [[21, 'Start', '2008-12-10', 'End'], ['2008-12-15', 'G']], 
 [[21, 'Start', '2008-12-10', 'End'], ['2008-12-15', 'G']],
 [[22, 'Start', '2009-01-10', 'End'], ['2009-12-10', 'B']]]

И для каждого элемента у меня есть несколько строк всписок.Не знаю почему?Извините, если мой вопрос слишком длинный.

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

пожалуйста, попробуйте это,

startlist=[]
endlist=[]
for item in mylist:
    if 'Start' in list(item):
        startlist.append(list(item))
    elif 'End' in list(item):
        endlist.append(list(item))
outlist=[i+j for i,j in zip(startlist,endlist)]     
0 голосов
/ 26 мая 2018

Ваш brr.append(arr) всегда добавляет массив для каждой строки, поэтому в выводе есть 6 элементов.Измените brr.append(arr) на:

if arr not in brr:
    brr.append(arr)

Что касается формата, arr.append([row[0], row[1], row[2]]) добавляет список из 3 элементов вместо 3 отдельных элементов.Вместо этого используйте extend.

Ваш окончательный код должен выглядеть следующим образом:

code = 0
brr = []
for row in mylist:

    if row[1] == "Start":
        arr = []
        code = row[0]
        arr.extend([row[0], row[1], row[2]])
        # continue not needed here

    if row[0] == code and row[1] == "End":
        arr.extend([row[1], row[2], row[3]])

    if arr not in brr:
        brr.append(arr)

for k in brr:
    print(k)
0 голосов
/ 26 мая 2018

Вы можете добиться этого довольно просто с помощью itertools.groupby :

import itertools
from pprint import pprint

mylist = [
    (20, 'Start', '2008-10-10', 'TBS'),
    (20, 'Foo', '2008-10-10', 'TBS'),
    (20, 'End', '2008-11-09', 'NG'),

    (21, 'Start', '2008-12-10', 'TBS'),
    (21, 'End', '2008-12-15', 'G'),

    (22, 'Start', '2009-01-10', 'TBS'),
    (22, 'End', '2009-12-10', 'B'),
]

rows = (x for x in mylist if x[1] in ('Start', 'End'))
grouped = itertools.groupby(rows, key=lambda x: x[0])
output = [[k, *next(grp)[1:3], *next(grp)[1:4]] for k, grp in grouped]
pprint(output)

Вывод:

[[20, 'Start', '2008-10-10', 'End', '2008-11-09', 'NG'],
 [21, 'Start', '2008-12-10', 'End', '2008-12-15', 'G'],
 [22, 'Start', '2009-01-10', 'End', '2009-12-10', 'B']]
0 голосов
/ 26 мая 2018

Вам необходимо использовать функцию arr.extend ()

arr = []
arr.append([1,2]) # arr = [[1,2]]
arr = []
arr.extend([1,2])  # arr = [1,2]
...