我有一个嵌套列表:
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'条目的通用方法。
答案 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]