2010-01-15 5 views
0

j'ai deux listes séparéesBesoin d'aide avec la manipulation de la liste python

list1 = ["Infantry","Tanks","Jets"] 
list2 = [ 10, 20, 30] 

dans la réalité, j'ai 10 d'infanterie, 20 chars et 30 Jets

Je veux créer une classe de sorte qu'à la fin , je peux appeler ceci:

for unit in units: 
    print unit.amount 
    print unit.name 

#and it will produce: 
# 10 Infantry 
# 20 Tanks 
# 30 Jets 

donc l'objectif est de combiner sorte de list1 et list2 dans une classe qui peut être facilement appelé.

avaient essayé de nombreuses combinaisons pour les 3 dernières heures, rien de bon avéré :(

Répondre

5

Cela devrait le faire:

class Unit: 
    """Very simple class to track a unit name, and an associated count.""" 
    def __init__(self, name, amount): 
    self.name = name 
    self.amount = amount 

# Pre-existing lists of types and amounts.  
list1 = ["Infantry", "Tanks", "Jets"] 
list2 = [ 10, 20, 30] 

# Create a list of Unit objects, and initialize using 
# pairs from the above lists.  
units = [] 
for a, b in zip(list1, list2): 
    units.append(Unit(a, b)) 
+0

'units.add (...)'? –

+0

@Dominic: oups, désolé à ce sujet. Fixe, et merci. – unwind

+1

compréhension de la liste on est mieux – Claudiu

18
class Unit(object): 
    def __init__(self, amount, name): 
    self.amount = amount 
    self.name = name 

units = [Unit(a, n) for (a, n) in zip(list2, list1)] 
8
from collections import namedtuple 

Unit = namedtuple("Unit", "name, amount") 
units = [Unit(*v) for v in zip(list1, list2)] 

for unit in units: 
    print "%4d %s" % (unit.amount, unit.name) 

Alex a souligné quelques détails avant

+1

Python 2.6+ seulement. –

+3

@Ignacio: qui est une version stable disponible depuis plus d'un an maintenant. – SilentGhost

+1

Il existe encore des versions Enterprise Linux distribuées en 2.5 ou même 2.4, et je pense que les observateurs doivent être conscients de l'exigence de version, même si cela ne finit pas par disqualifier la solution concernant l'OP. –

5

En Python 2.6, je recommanderais un named tuple - les Code s que d'écrire la classe simple et très frugal dans l'utilisation de la mémoire aussi:

import collections 

Unit = collections.namedtuple('Unit', 'amount name') 

units = [Unit(a, n) for a, n in zip(list2, list1)] 

Lorsqu'une classe a un ensemble fixe de champs (n'a pas besoin de ses instances pour être « extensible » avec de nouveaux champs arbitraires per- instance) et aucun "comportement" spécifique (c'est-à-dire pas de méthodes spécifiques nécessaires), pensez à utiliser un type de tuple à la place (hélas, pas disponible en Python 2.5 ou plus tôt, si vous êtes bloqué avec ça ;-).

+1

Quoi, j'ai battu Alex Martelli à une réponse Python? Comment est-ce arrivé? Je pense que j'ai besoin d'une minute pour assouplir et m'assurer que ce n'est pas encore 2012 ou 2038. –

+0

@Roger, heh, yep - J'ai pris le temps de fournir le lien, de souligner soigneusement la dépendance à 2.6 pour éviter les gémissements habituels d'Ignacio (qui sont arrivés ponctuellement à la vôtre ;-), etc., donc votre réponse est arrivée le mien était toujours "en vol" ;-). –

2

Que diriez-vous d'un dictionnaire:

units = dict(zip(list1,list2)) 

for type,amount in units.iteritems(): 
    print amount,type 

extensible Endlessly pour plus d'informations, et facile à manipuler. Si un type de base fait le travail, pensez à ne pas l'utiliser.

Questions connexes