7
votes

Comment obtenir chaque élément dans une liste de listes de listes?

Je fais un jeu de coeur pour ma mission mais je ne sais pas comment obtenir chaque élément dans une liste de liste: xxx

et ce qui se voit à mon esprit est: < / p> xxx

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?


5 commentaires

J'ai édité votre code pour ajouter dans un "supplémentaire" 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']]?


9 Réponses :


4
votes

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


0 commentaires

6
votes

Onliner légèrement obscur: xxx

Vous voudrez peut-être donner des noms de plus descriptifs, B et C plus descriptifs.


4 commentaires

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?



15
votes

Comme ceci: xxx

comme, Nacholibre a souligné, le package compilateur est obsolète. Ceci est la source de aplatissé : xxx


7 commentaires

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.


@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)) . 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.



2
votes

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 Numpy.ndarray code>.

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>

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()


0 commentaires

2
votes

Utilisation des générateurs, il est possible d'écrire une implémentation beaucoup plus lisible de Flatten code>: xxx pré>

ou, si vous utilisez Python 3.3, qui ajoute le 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']


0 commentaires

2
votes

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']


0 commentaires

2
votes

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 ou isinstance (...) dans le code ci-dessous.

Ça appelle Récursivement une fonction qui se déroule: xxx


0 commentaires

1
votes

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']
>>> 


0 commentaires

1
votes
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!

0 commentaires