将随机元素分类为字典?Python



我试图将随机选择附加到字典中,但我的代码似乎不起作用。

我正在使用的文件(mood.txt):

happy, Jennifer Clause
happy, Jake Foster
sad, Jonathan Bower
mad, Penny
excited, Logan 
awkward, Mason Tyme

我的代码:

def theFile():
    moodFile = open("mood.txt")
    theMood = moodFile.readlines()
    moodFile.close()
    return(theMood)
def makeTheDict(myFile):
    moodDict = {}
    for lines in myFile:
        (mood, name) = lines.split(",")
        moodDict[mood] = name.strip()
    return(moodDict)

def randomMood(name, mood, moodDict):
if mood in moodDict:
    randomMood = random.choice(mood)
    moodDict[mood] = randomMood
    moodDict.append(name, randomMood)
    print(name, "has been put in the", randomMood, "group")

def main():
    moodFile = theFile()
    moodDict = makeTheDict(moodFile)

    name = input("Choose a name: ")
    newMood = input("Choose a mood: ")
    randomMood(name, newMood, moodDict)

例如,我想在一个随机组中添加一个" Jamie Green",如果它随机选择了" sad",则 -

happy, Jennifer Clause
happy, Jake Foster
sad, Jonathan Bower
mad, Penny
excited, Logan 
awkward, Mason Tyme
#sad, Jamie Green 

我将如何随机地将其附加到字典中?

谢谢!

似乎您想将字符串映射到字符串列表,而是您将字符串映射到字符串。

看这一行:

moodDict[mood] = name.strip()

在这里,您将字符串mood映射到字符串name.strip()。如果此时,已经有一个名字映射到当前的心情,那么旧值将被替换和丢失。在您的文件样本中,Jennifer和Jake都很高兴。在第一次迭代时,您有:

moodDict["happy"] = "Jennifer Clause"

然后,在第二步,您有。

moodDict["happy"] = "Jake Foster"

在这里,"杰克·福斯特"替换了"詹妮弗子句"。由于可以重复情绪,因此您可能想要的是这样的东西:

if mood in moodDict:
    moonDict[mood].append(name.strip())
else:
    moonDict[mood] = [name.strip()]

这样,对于每个情绪密钥,您都有一个名称值列表。

关于randommood功能,有可能看起来不好:

  • if语句应缩进,因为是该功能的一部分。这应该抛出一个缩进器,但是我会认为当您将代码复制到Stackoverflow中时发生。
  • 情绪是一个字符串,因此您在random.choice(mood)中实际在做的是从该字符串中选择一个随机字符,这是没有任何意义的。您可能想从情绪列表中进行选择,这将是这样的randomMood = random.choice(moodDict.keys())
  • 因为我在上几点中解释了以下几行,只需用情绪中的随机字符替换情绪键下的值,这是没有意义的。
  • 字典没有任何名为 append的方法,这也应该丢弃错误。您可能想用以下方式替换它:moondict [randommood] .append(name)
  • 最后,我不明白为什么您要求用户在应该随机选择时输入心情。

看来,您对Python词典是什么以及它的工作方式有些困惑。请记住,它将键映射到值。在您的代码中,您的键是情绪,值是名称,都表示为字符串。钥匙是独一无二的。这意味着,如果您将新值分配给现有密钥,则该密钥下映射的旧值将丢失。如果要在同一键下处理多个值,则应将键映射到一个值集合,例如列表,而不是单个值。

最新更新