J'ai une liste imbriquée:

for i in my_lst:
    print(i)

output: 

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

J'essaie de ne sélectionner que les listes où l'élément 0 est «A» ... et imprime uniquement le premier 2. Je peux le faire mais il doit y avoir un moyen plus simple.

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'est qu'un exemple. Je veux un moyen générique de sélectionner les entrées «n» où la condition est remplie.

0
arsenal88 12 avril 2018 à 15:19

5 réponses

Meilleure réponse

Si je vous comprends bien, vous devez simplement mettre cette boucle dans une fonction et analyser count_max comme paramètre.

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)

MODIFIER : Si cela ne vous dérange pas les performances et que vous souhaitez avoir moins de code, c'est moins de code à l'aide des opérations dans la liste pythons:

def select_lists(my_list, count_max=2):
    matches = [row for row in my_list if row[0] == 'A']
    print(matches[:count_max])
1
flyingdutchman 12 avril 2018 à 12:45

Utilisation de enumerate

Ex:

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

Sortie:

['A', 2, 3]
['A', 3, 6]
1
Rakesh 12 avril 2018 à 12:25

Si cela ne vous dérange pas de le convertir en tableau numpy, vous pouvez le faire:

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

Utilisez la compréhension de liste et le découpage pour une ligne:

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

Production:

[['A', 2, 3], ['A', 3, 6]]
0
Kazuya Hatta 12 avril 2018 à 12:48

Vous pouvez également considérer ce problème comme une manipulation des itérateurs. Il existe déjà une fonction, itertools.islice pour prendre des tranches d'itérateurs.

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]
0
Patrick Haugh 12 avril 2018 à 12:34