在条件列表中选择'n'条目

时间:2018-04-12 12:19:44

标签: python python-3.x python-2.7

我有一个嵌套列表:

for i in my_lst:
    print(i)

output: 

['A', 2, 3]
['A', 3, 6]
['B', 11, 1]
['A', 13 3]

我试图只选择元素0为'A'的列表...并且只打印第一个2.我可以这样做,但必须有一个更简单的方法。

count_max = 2
count = 0

for i, row in enumerate(my_lst):
    if row[0] == 'A':
        count+=1
        print(row)
        if count == count_max:
            break

count_max = 2只是一个例子。我想要一种选择条件的选择'n'条目的通用方法。

5 个答案:

答案 0 :(得分:1)

如果我理解正确,你应该把这个循环放到一个函数中并解析count_max作为参数。

def select_lists(my_list, count_max=2):
    for i, row in enumerate(my_list):
        if row[0] == 'A':
            count += 1
            print(row)
            if count == count_max:
                break

select_lists(the_list, 5)

修改: 如果你不介意性能,并希望你有更少的代码,那么使用pythons in-list操作的代码就更少了:

def select_lists(my_list, count_max=2):
    matches = [row for row in my_list if row[0] == 'A']
    print(matches[:count_max])

答案 1 :(得分:1)

使用enumerate

<强>实施例

count_max = 2
data = [['A', 2, 3],['A', 3, 6],['B', 11, 1],['A', 13, 3]]
for i,v in enumerate(data, 1):     #enumerate start index at 1
    if v[0] == "A":
        print(v)
    if i == count_max:             #Check if index equals count_max
        break

<强>输出:

['A', 2, 3]
['A', 3, 6]

答案 2 :(得分:1)

如果你不介意将它转换为numpy数组,你可以这样做:

n = 2
nestedList = np.array([['A', 2, 3], ['A', 3, 6], ['B', 11, 1], ['A', 13, 3]])
result = nestedList[(nestedList [:, 0] == "A"), :][:n].tolist()

答案 3 :(得分:0)

使用列表理解和切片为单行:

[a for a in my_lst if a[0]=='A'][:2]

输出:

[['A', 2, 3], ['A', 3, 6]]

答案 4 :(得分:0)

您也可以将此问题视为操纵迭代器。已经有一个函数itertools.islice用于获取迭代器片段。

from itertools import islice

def take_n_where(it, n, condition):
    return islice(filter(condition, it), n)

def take_n_As(it, n):
    return take_n_where(it, n, lambda x: x[0] == 'A')

my_lst = [['A', 2, 3], ['A', 3, 6], ['B', 11, 1], ['A', 13, 3]]

for x in take_n_As(my_lst, 2):
    print(x)

# ['A', 2, 3]
# ['A', 3, 6]