Нужна помощь с манипулированием списком Python - PullRequest
0 голосов
/ 15 января 2010

у меня есть два отдельных списка

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

так на самом деле у меня есть 10 пехотных, 20 танков и 30 самолетов

Я хочу создать класс, чтобы в конце я мог вызвать это:

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

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

поэтому цель состоит в том, чтобы объединить list1 и list2 в класс, который можно легко вызвать.

пробовал много комбинаций за последние 3 часа, ничего хорошего не получилось: (

Ответы [ 5 ]

18 голосов
/ 15 января 2010
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 голосов
/ 15 января 2010
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)

Алекс указал несколько деталей, прежде чем я смог.

5 голосов
/ 15 января 2010

В Python 2.6 я бы порекомендовал именованный кортеж - меньше кода, чем при написании простого класса, и очень экономное использование памяти:

import collections

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

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

Когда у класса есть фиксированный набор полей (не требуется, чтобы его экземпляры были «расширяемыми» с новыми произвольными полями для каждого экземпляра) и не было конкретного «поведения» (т. Е. Не нужно никаких специальных методов), рассмотрите возможность использования именованный тип кортежа (увы, недоступен в Python 2.5 или более ранней версии, если вы застряли с этим; -).

5 голосов
/ 15 января 2010

Это должно сделать это:

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))
2 голосов
/ 15 января 2010

Как насчет словаря:

units = dict(zip(list1,list2))

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

Бесконечно расширяемый для дополнительной информации, и легко манипулируемый. Если базовый тип выполнит работу, подумайте о том, чтобы не использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...