Je fais un jeu de coeur pour ma mission mais je ne sais pas comment obtenir chaque élément dans une liste de liste: et ce qui se voit à mon esprit est: < / p> mais je pense que je viens d'avoir un élément qui a 2 liste. Comment calculer celui qui a une liste 3 et 1 dans les cartes? P> p>
9 Réponses :
Si vos cartes sont imbriquées de manière difficile:
>>> print(timeit.timeit(r'getCards([[["QS","5H","AS"],["2H","8H"],["7C"]],[["9H","5C"],["JH"]],["7D"]],[])',setup="from clas import getCards")) 5.24880099297 >>> timeit.timeit(r'flatten([[["QS","5H","AS"],["2H","8H"],["7C"]],[["9H","5C"],["JH"]],["7D"]])',setup="from compiler.ast import flatten") 7.010887145996094
Onliner légèrement obscur: Vous voudrez peut-être donner des noms de plus descriptifs, B et C plus descriptifs. P> P>
Il semble correct pour la partie de début. Mais les 7 et D sont séparés
@blubber Le problème est qu'ils ne sont pas imbriqués uni-formellement (qui est un moyen étrange de stocker vos données de jeu ...)
Oui, je vois ça maintenant. Eh bien, vous ne pouvez pas l'utiliser, cela ne fonctionne que sur des listes formées régulièrement.
@Erikasawajiri Le dernier élément de la liste devrait être [['7d']] n'est-ce pas une faute de frappe?
Comme ceci: comme, Nacholibre a souligné, le package compilateur code> est obsolète. Ceci est la source de aplatissé code>: p>
Brillant! Je ne savais pas que cela existait.
Je ne pense pas qu'ils voulaient que la fonction soit utilisée comme celle-ci, mais si cela fonctionne ... :).
Important: obsolète depuis la version 2.6: Le package Compiler a été supprimé dans Python 3. Code>
@Hans mais votre fonction aplatit séparera tous les éléments comme 7 et C. Ce que je veux, c'est 7c
Est-ce que cela va? Je pense que cela ne fera que itération des listes et des tuples, pas des cordes.
La vérification de type dans le code cité est assez laide et fragile (elle ne gérera pas la liste ou les sous-classes de tuple). Un meilleur serait si IsInstance (elt, (liste, tuple)) code>. Si vous faites votre propre code aplatit de toute façon, vous voudrez peut-être aussi faire un générateur plutôt que de construire une liste (éventuellement inutile).
Je viens de copier le code de compiler.ast.flatten. Bien sûr, un générateur serait bien aussi, mais cela dépend des exigences réelles.
Votre liste est une liste imbriquée incomplète, vous pouvez donc la rendre rectangulaire, Utilisation de la procédure expliquée ici , pour Exemple, puis aplatir l'aplatir le Le "IFS" ci-dessous ne serait pas aussi nécessaire si le dernier élément ['7d'] était [['7d']] (Ensuite, les autres réponses fonctionnent également). P> Numpy.ndarray code>. import numpy as np
collector = np.zeros((3,3,3),dtype='|S20')
for (i,j,k), v in np.ndenumerate( collector ):
try:
if not isinstance(cards[i], str):
if not isinstance(cards[i][j], str):
collector[i,j,k] = cards[i][j][k]
else:
collector[i,j,0] = cards[i][j]
else:
collector[i,0,0] = cards[i]
except IndexError:
collector[i,j,k] = ''
print collector[collector<>''].flatten()
Utilisation des générateurs, il est possible d'écrire une implémentation beaucoup plus lisible de ou, si vous utilisez Python 3.3, qui ajoute le Flatten code>: Rendement de code> Syntaxe: P> >>> list(flatten([[["QS","5H","AS"],["2H","8H"],["7C"]],[["9H","5C"],["JH"]],[["7D"]]]))
['QS', '5H', 'AS', '2H', '8H', '7C', '9H', '5C', 'JH', '7D']
Utilisez 2 iTertools.chain pour aplatir la liste :
In [32]: Cards Out[32]: [[['QS', '5H', 'AS'], ['2H', '8H'], ['7C']], [['9H', '5C'], ['JH']], ['7D']] In [33]: from itertools import chain In [34]: [k for k in chain.from_iterable([i for i in chain.from_iterable(Cards)])] Out[34]: ['QS', '5H', 'AS', '2H', '8H', '7C', '9H', '5C', 'JH', '7', 'D']
Cette solution est très robuste pour tout type de listes ni de buples imbriquées (d'ajouter d'autres types itérables, ajoutez davantage Ça appelle Récursivement une fonction qui se déroule: p> ou isinstance (...) code> dans le code ci-dessous.
en utilisant Aplatissez une liste du code Rosetta que vous pourriez faire:
>>> def flatten(lst):
return sum( ([x] if not isinstance(x, list) else flatten(x)
for x in lst), [] )
>>> Cards = [[["QS","5H","AS"],["2H","8H"],["7C"]],[["9H","5C"],["JH"]],["7D"]]
>>> flatten(Cards)
['QS', '5H', 'AS', '2H', '8H', '7C', '9H', '5C', 'JH', '7D']
>>>
from itertools import chain, imap l= [[["QS","5H","AS"],["2H","8H"],["7C"]],[["9H","5C"],["JH"]],[["7D"]]] k = list(chain.from_iterable(imap(list, l))) m = list(chain.from_iterable(imap(list, k))) print m output: ['QS', '5H', 'AS', '2H', '8H', '7C', '9H', '5C', 'JH', '7D']Itertools is amazing!
J'ai édité votre code pour ajouter dans un
"supplémentaire" code> comme il manque. Pourquoi avez-vous rétabli cette modification?Vous aurez besoin d'une certaine récursivité pour réaliser ce que vous voulez de manière propre.
Avez-vous toutes les cartes à la même profondeur? Ensuite, vous avez juste besoin d'y aller.
On dirait que vous avez une liste de liste de listes, mais vous n'avez pas fermé le support final.
@Erika Sawajiri n'est-ce pas une erreur dans le dernier élément ['7d']? Ne devrait-il pas être [['7d']]?