2013-12-16 6 views
0

Теперь, когда я знаю, как выполнять итерацию через dict, мне нужно знать, как перебирать список и иметь возможность печатать каждого клиента, аккаунт и транзакцию. У меня есть 3 класса Customer, Account и Transaction. В классе Customer я помещаю список для хранения объектов Account и в классе Account, у меня есть список для хранения объектов Transaction. В конце этого кода у меня есть цикл for, повторяющийся через карту, но когда я пытаюсь выполнить итерацию по списку, он, похоже, не работает. Скорее всего, это связано с моей собственной ошибкой.Итерация через dict, список в python

class Customer(object): 
'''Main Constructor''' 
def__init__(self,CNumber=1,CName="A",CAddress="A",CCity="A",CState="A",CZipCode=1,CPhone="1",Account=[]): 
    self.CNumber = CNumber 
    self.CName = CName 
    self.CAddress = CAddress 
    self.CCity = CCity 
    self.CState = CState 
    self.CZipCode = CZipCode 
    self.CPhone = CPhone 
    self.Account = Account 

dict = {} 
c = Customer.Customer("1111","Jake","Main St","Happy Valley","CA","96687","8976098765") 
dict[c.getCNumber()] = c 
c = Customer.Customer("2222","Paul","3342 CherrySt","Seatle","WA","98673","9646745678") 
dict[c.getCNumber()] = c 

a = Account.Account("1111",True,0.00,500.00) 
dict[c.getCNumber()].AddAccount(a) 
a = Account.Account("2222",True,0.00,500.00) 
dict[c.getCNumber()].AddAccount(a) 
a = Account.Account("3333",False,0.02,10000.00) 
dict[c.getCNumber()].AddAccount(a) 
a = Account.Account("4444",False,0.02,10000.00) 
dict[c.getCNumber()].AddAccount(a) 

for key in sorted(dict.keys()): 
    print("***Customer***") 
    print("Customer Number: " + dict[key].getCNumber()) 
    print(dict[key].getCName()) 
    print(dict[key].getCAddress()) 
    print(dict[key].getCCity() + ", " + dict[key].getCState() + " " + dict[key].getCZipCode()) 
    for key1 in dict[key].getAccount()[key1]: 
     print("\t***Account***") 
     print("\tAccount Number: " + a.getANumber()) 
     print("\t" + a.getAType()) 
     print("\t" + a.getAInterestRate()) 

Если вам нужна дополнительная информация, то дайте мне знать. Мне нужно, чтобы он печатал каждого клиента (который находится внутри dict) и каждой учетной записи, связанной с этим клиентом. В будущем мне понадобятся все транзакции, связанные с этой учетной записью. Я сделал это в Java (и это работает) следующим образом:

 for (Customer c : customerMap.values()) { 
     // Print the customer name, address, etc. 
     System.out.println("\n**********Customer**********"); 
     System.out.println("Customer Number: " + c.getCustomerNumber()); 
     System.out.println(c.getCustomerName()); 
     System.out.println(c.getCustomerAddress()); 
     System.out.println(c.getCustomerCity() + ", " 
       + c.getCustomerState() + " " + c.getCustomerZipCode()); 
     System.out.println(c.getCustomerPhone()); 
     for (Account a : c.getAllAccounts()) { 
      // Print the account balance, id, type 
      System.out.println("\t**********Account**********"); 
      System.out.println("\tAccount Number: " + a.getAccountNumber()); 
      if (a.getAccountType() == true) { 
       System.out.println("\tAccount Type: Checking"); 
      } else { 
       System.out.println("\tAccount Type: Savings"); 
      } 
      System.out.println("\tAccount Balance: " + a.getBalance()); 
      System.out.println("\tInterest Rate: " + a.getInterestRate()); 
      for (Transaction t : a.getAllTransactions()) { 
       // Go through the transactions of this account 
       System.out.println("\t\t**********Transactions**********"); 
       System.out.println("\t\tTransaction Date: " + t.getDate()); 
       System.out.println("\t\tTransaction Amount: " 
         + t.getAmount()); 
       if (t.getDebitOrCredit() == true) { 
        System.out.println("\t\tDebit or Credit: Credit"); 
       } else { 
        System.out.println("\t\tDebit or Credit: Debit"); 
       } 
       System.out.println("\t\tMemo: " + t.getMemo()); 

      }// for 
     }// for 
    }// for 

Ваша помощь очень ценится

+0

я думаю, где я получаю зависший находится в этом коде: для key1 в dict [key] .getAccount() [key1]: Какой синтаксис нужно изменить? – user3106444

+0

для key1 in dict [key] .getAccount(): – dano

ответ

3

Итерации над пунктами а dict «s:

>>> d = {"a": 1, "b": 2, "c": 3} 
>>> for k, v in d.items(): 
...  print "{}={}".format(k, v) 
... 
a=1 
c=3 
b=2 

Итерации над dict 'ы ключи:

>>> for k in d.keys(): 
...  print k 
... 
a 
c 
b 

Итерации над dict' значения ы:

>>> for v in d.values(): 
...  print v 
... 
1 
3 
2 

Итерации над list:

>>> xs = [1, 2, 3] 
>>> for x in xs: 
...  print x 
... 
1 
2 
3 
>>> 

Примечание (ы):

  • НЕ называть переменные dict или list как они в тень и внутренние команды может вызвать проблемы.
0

Проверить эту строку кода:

for key1 in dict[key].getAccount()[key1]: 

Вы не можете определить key1 с ссылка на key1

+0

Я не понимаю, что я должен исправить для его работы – user3106444

+0

Если 'dict [key] .getAccount()' возвращает список, тогда код 'для key1 в dict [key] .getAccount() 'позволит вам перебирать каждую учетную запись в этом списке, используя ссылку' key1'. В теле цикла замените ссылки на 'a.' на' key1.' – Destruktor

+0

Я все еще не получаю, чтобы itorator работал. getAccount() возвращает список, с которым я работаю. Я думаю, что ошибка заключается в синтаксисе возврата списка – user3106444

0

Чтобы перебирать список, вы можете сделать следующее:

a = [1,2,3,4,5] 

for item in a: 
    print item 

1 
2 
3 
4 
5 

выше было произвольным, я мог бы использовать слово 'пункт' почти ничего:

for i in a: 
    print i+1 

2 
3 
4 
5 
6 

но по существу, это:

for element in listname: 
    do something 

Есть и другие способы, но вот некоторые документы: http://www.diveintopython.net/file_handling/for_loops.html

перебрать Dict

вы можете сделать:

for key in d.keys(): # iterates through a list of the dict d's keys 
    some code.. 

for value in d.values(): #iterates through a list of dict d's values 
    some code.. 

for key, value in d.items(): #iterates through a list of key/value pairs from d 
    code code... 
Смежные вопросы