Вложенная итерация внутри 2D-списка - PullRequest
0 голосов
/ 04 июня 2018

У меня есть такой список: я хочу, чтобы все значения, за которыми следовал элемент «A».

mylist = [['B', '\n\t\t'], ['A', 'val1'], ['B', '1*'], 
['A', 'val2'], ['B', '2'], ['A', 'val3'], 
['B', '1'], ['A', 'val4'], ['B', '2'], 
['A', 'val5'], ['B', '2'], ['A', 'val6'], 
['B', '1'], ['B', '3']]

Например, если я передам val1, вывод должен быть1*

Вход

val2

Выход

2

Вход

val6

Вывод

13

Игнорировать любую другую запись

Я пробовал это, но он не работает

tag = "A"
for i in range(len(mylist)):
    #print(mylist[i][0])
    #print(i)
    if mylist[i][1] == tag:
        print(mylist[i][1])
        for j in range(len(mylist)):
            print(i+j+1)
            if mylist[i+j][0] != 'A':
                print(mylist[i+j][1])

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы можете использовать itertools.groupby для группировки элементов.Затем создайте отображение с помощью словарного понимания.Использование itertools.islice избавляет от необходимости создавать новые списки на втором шаге.

from itertools import groupby, islice
from operator import itemgetter

lst = [list(j) for _, j in groupby(mylist, key=itemgetter(0))]

res = {i[0][1]: ''.join(map(itemgetter(1), j)) for i, j in 
       zip(islice(lst, 1, None, 2), islice(lst, 2, None, 2))}

{'val1': '1*',
 'val2': '2',
 'val3': '1',
 'val4': '2',
 'val5': '2',
 'val6': '13'}
0 голосов
/ 04 июня 2018

Решено с помощью обработки индекса

tag = "A"
for i in range(len(mylist)):
    #print(mylist[i][0])
    #print(len(mylist))
    if mylist[i][1] == tag:
        print(mylist[i][1])
        for j in range(len(mylist)):
            #print("index",i+j)
            if mylist[i+j][0] != 'A':
                print(mylist[i+j][1])
            if (i+j+1) >= len(mylist) or mylist[i+j+1][0] == 'A':
                break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...