2013-09-07 8 views
0

Я пытаюсь получить first_name и last_name, чтобы объединить их в новую запись словаря. Сколько зависит от того, сколько людей покупают в магазине. Если я куплю 50 солдат, я всегда получаю меньше этого.Объединение записей в словарь

import random, math 
first_name = [ "Emily", "Steve" , "Dave" , "Bob" , "James" , "Jim" , "Jenny" , "Will" , "Ryan" ] 
last_name = [ "Wright" , "Kalman" , "Meitzen" , "Cole" , "Robins" , "Harrison" , "Saturn" ] 
troops = {} 
money = 1000 

def shop(): 
    loop = 0 
    global money, first_name, last_name, troops 
    while loop == 0 : 
     print(""" 
     Your Money = {} 
     (Number , Item , cost) 
     0, Quit ,N/A 
     1, Troop, 10 
     """.format(money)) 
     shopq = int(input("What do you want to buy")) 

     if shopq == 1: 
      shopq2 = int(input("How many")) 
      if shopq2 > money : 
       print(" You cannot by this many") 
      else: 
       print("You can buy that many") 
       money = money - shopq2 
       troop_number = 0 
       while troop_number < shopq2 : 
        s_name = random.choice(first_name) + " " + random.choice(last_name) 
        troops[s_name] = 100 
        troop_number = troop_number + 1 
       print(troops) 

      print(" Money = {}".format(money)) 
     elif shopq == 0: 
      break 

class dropship: 
    def create(self, troops): 
     troop_number = 0 
     for k in troops : 
      troop_number = troop_number + 1 
     print("troops = {}".format(troop_number)) 

shop() 
x = dropship() 
x.create(troops) 

Выход:

 Your Money = 1000 
     (Number , Item , cost) 
     0, Quit ,N/A 
     1, Troop, 10 

What do you want to buy1 
How many50 
You can buy that many 
{'Ryan Wright': 100, 'Bob Cole': 100, 'Bob Kalman': 100, 'Will Wright': 100, 'Dave Cole': 100, 'Dave Robins': 100, 'Emily Kalman': 100, 'Jenny Kalman': 100, 'Bob Harrison': 100, 'Emily Wright': 100, 'Will Cole': 100, 'Jim Wright': 100, 'Dave Kalman': 100, 'Dave Wright': 100, 'Bob Meitzen': 100, 'Jenny Wright': 100, 'Jenny Harrison': 100, 'Dave Saturn': 100, 'James Robins': 100, 'Bob Robins': 100, 'Dave Meitzen': 100, 'Steve Wright': 100, 'Bob Wright': 100, 'Steve Kalman': 100, 'Ryan Harrison': 100, 'Jim Saturn': 100, 'Steve Robins': 100, 'Ryan Cole': 100, 'Jim Meitzen': 100, 'James Cole': 100, 'Emily Cole': 100, 'Ryan Saturn': 100, 'Steve Harrison': 100} 
Money = 950 

     Your Money = 950 
     (Number , Item , cost) 
     0, Quit ,N/A 
     1, Troop, 10 

What do you want to buy0 
troops = 33 
+3

Что вы хотите сказать? –

ответ

4

Вы создаете случайные имена, и некоторые из них будут такими же, случайно, поэтому они заменяют предыдущие записи в словаре (словарные ключи уникальны). Вам придется изменить способ, которым вы это делаете. Например:

import random 
import itertools 
random.sample(list(itertools.product(first_name, last_name)), 50) 

Но вы должны также получить гораздо большие пулы имен и фамилии, в противном случае вы можете иметь только 63 различные полные имена.

1

Проблема с вашим словарем в том, что словарные ключи должны быть уникальными. Поскольку вы используете случайно выбранные имена, сращенные вместе как ключи, очень вероятно, что вы будете генерировать 'Ryan Wright' (например) более одного раза.

Вот что ваш код делает, что вызывает у вас прийти с «коротким» подсчитывать:

troops['Ryan Wright'] = 100 
troops['Bob Cole'] = 100 
troops['Ryan Wright'] = 100 

Третье задание используется один и тот же слот в словаре troops потому что ключ такой же. Если бы ваш код был только этими тремя строками, у вас был бы словарь с двумя записями, а не три, на которые вы бы надеялись. Вы можете увидеть это происходит в вашем коде, добавив assert заявление:

s_name = random.choice(first_name) + " " + random.choice(last_name) 
assert s_name not in troops 
troops[s_name] = 100 

Это не решит проблему, но она покажет вам, что ваши ключи встречными.

Смежные вопросы