【问题标题】:Combining list entries into a dictionary将列表条目组合成字典
【发布时间】:2013-09-11 13:16:13
【问题描述】:

我正在尝试将 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

【问题讨论】:

  • 你有什么问题?

标签: python list class dictionary python-3.x


【解决方案1】:

您正在创建随机名称,其中一些随机名称可能是相同的,因此它们会替换字典中的先前条目(字典键是唯一的)。你必须改变你这样做的方式。例如:

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

但是您还应该获得更大的名字和姓氏池,否则您只能拥有 63 个不同的全名。

【讨论】:

    【解决方案2】:

    您的字典的问题是字典键必须是唯一的。由于您使用随机选择的名称拼接在一起作为键,您很可能会多次生成'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
    

    它不会解决您的问题,但它会告诉您您的键正在碰撞。

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2021-07-09
      • 2019-03-26
      • 1970-01-01
      相关资源
      最近更新 更多