将随机元素排序到字典中?蟒蛇

时间:2016-11-23 22:15:11

标签: python dictionary

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

我正在使用的文件(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 

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

看看这一行:

moodDict[mood] = name.strip()

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

moodDict["happy"] = "Jennifer Clause"

然后,在第二步,你有。

moodDict["happy"] = "Jake Foster"

这里“Jake Foster”取代了“Jennifer Clause”。由于情绪可以重复,你可能想要的是这样的:

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

这样,对于每个心情键,您都有一个名称值列表。

关于randomMood函数,有些东西看起来不太好:

  • if语句应该缩进,因为它是函数的一部分。这应该抛出IndentationError,但我会假设你将代码复制到StackOverflow时发生了。
  • 心情是一个字符串,所以你在random.choice(mood)中实际做的是从该字符串中选择一个随机字符,这没有任何意义。您可能希望从心情列表中进行选择,这类似于randomMood = random.choice(moodDict.keys())
  • 由于我在上一点所解释的内容,以下行只是用心情中的随机字符替换心情键下的值,这没有意义。
  • 字典没有任何名为append的方法,这也应该抛出错误。您可能希望将其替换为:moonDict [randomMood] .append(name)
  • 最后,我不明白为什么要让用户输入应该随机选择的情绪。

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