嵌套迭代在2D列表中

时间:2018-06-04 06:02:21

标签: python python-3.x list grouping

我有一个这样的列表,我想做的是我想要所有的值跟随'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 :(得分:1)

使用索引处理解决了它

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

答案 1 :(得分:1)

您可以使用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'}