1
votes

Comment sélectionner des éléments de listes dans un groupe de listes, si les éléments (chaîne) commencent par une lettre / un chiffre?

Ici, je veux sélectionner les éléments de chaque liste qui remplissent la condition qu'ils commencent par «6». Cependant, je n'ai pas trouvé le moyen d'y parvenir.

Les listes sont converties à partir d'un dataframe:

"[['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]"
['6', '6', '6', '6', '6', '6', '6', '6', '6']
[x for x in list if x.startswith('6')]


0 commentaires

3 Réponses :


0
votes

Essayez ceci:

flatten = lambda l: [[item] for sublist in l for item in sublist]
print( flatten([ df[col][df[col].str.startswith("6") ].tolist() for col in df]))

Ici, j'ai utilisé un générateur de liste qui collecte toutes les cellules correspondantes dans une liste, tout en itérant sur les colonnes; cela donne [['64774', '60240', '60500'], ['60271', '60502'], ['60500']] . Pour obtenir la sortie souhaitée, j'ai défini une fonction aplatir qui aplatit (un peu) cette liste en [['64774'], ['60240'], ['60500'], [ '60271'], ['60502'], ['60500']] .


0 commentaires

1
votes

Vous n'avez pas besoin de convertir votre liste en str (liste) car elle est déjà de type chaîne.

[['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]

Résultat:

lst = df.values.tolist()
lst = [[i] for l in lst for i in l if i.startswith('6') ]
print(lst)


1 commentaires

Pas besoin de convertir un tableau en liste, vous pouvez simplement faire [[a] pour arr dans df.to_numpy () pour un in arr si a.startswith ('6')] (en utilisant préféré to_numpy () plutôt que valeurs ).



2
votes

Lorsque vous faites list = str (liste) vous convertissez votre liste en une représentation sous forme de chaîne, c'est-à-dire que list devient

d = {
  'c1': ['64774', '60240', '60500', '19303', '38724', '11402'], 
  'c2': ['', '95868', '95867', '60271', '60502', '19125'],
  'c3':['','','','','95867','60500']
}

d2 = [[x] for v in d.values() for x in v if x.startswith('6')]
# d2: [['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]

Vous parcourez ensuite la chaîne avec la compréhension de la liste

['6', '6', '6', '6', '6', '6', '6', '6', '6']

Ce qui produit chaque caractère individuel dans la chaîne, ce qui signifie que vous ne trouvez que toutes les occurrences de 6 dans la chaîne, d'où votre résultat de

[x for x in list if x.startswith('6')]

Note de bas de page: N'utilisez pas de noms de variables qui masquent les fonctions intégrées, comme list , dict et ainsi de suite, cela causera presque certainement des problèmes sur toute la ligne.

Je ne suis pas sûr qu'il y ait une raison spécifique d'utiliser un dataframe / pandas pour votre question. Sinon, vous pouvez simplement utiliser une compréhension de liste

"[['64774', '', ''], ['60240', '95868', ''], ['60500', '95867', ''], ['19303', '60271', ''], ['38724', '60502', '95867'], ['11402', '19125', '60500']]"


2 commentaires

Merci pour toutes les notes !!


Vous êtes les bienvenus. Si l'une des réponses ici a résolu votre problème, veuillez la marquer comme réponse en cliquant sur la coche grise à côté.