Python 为什么我的字典复制的是键而不是值?

Python 为什么我的字典复制的是键而不是值?,python,Python,我开始修补Python,为此,我一直在做来自/r/DailyProgrammer的(超级简单)挑战。我刚开始用它作为输入,现在我只需要简单地数几块糖果。这是我目前的代码: myInput = open("C:/users/jacob/desktop/python/186/candy.txt").readlines() candyDict = dict() for line in myInput: if line not in candyDict: candyDict[li

我开始修补Python,为此,我一直在做来自/r/DailyProgrammer的(超级简单)挑战。我刚开始用它作为输入,现在我只需要简单地数几块糖果。这是我目前的代码:

myInput = open("C:/users/jacob/desktop/python/186/candy.txt").readlines()
candyDict = dict()
for line in myInput:
    if line not in candyDict:
        candyDict[line] = 0
    if line in candyDict:
        candyDict[line] += 1

for item in candyDict.keys():
    print(str(candyDict[item]) + " : " + item.replace('\n', ""))
这是我的输出:

44 : Skittles
62 : Rock
45 : Jolly Rancher
41 : Snickers
41 : Runts
36 : Almond Joy
39 : Candy Corn
46 : Popcorn
48 : Peppermint Candy
50 : Tootsie Roll
41 : Nerds
44 : Bubblegum
46 : Lollipop
46 : Sweet Tarts
47 : M&Ms
50 : Crunch Bar
67 : Kit Kat
53 : Lifesavers
48 : Tangy Taffy
57 : Peanut Butter Cup
48 : Smarties
1 : M&Ms

为什么在文件末尾附加了一个
M&Ms
?我认为这是因为
M&Ms
也是文件的最后一行,但这并不能解释为什么会这样重复。如果您能提供任何有关原因的线索,我们将不胜感激。

行的末尾有一个行尾字符(
“\n”
),这是您在替换行进行打印时注意到的。文件中的最后一行可能没有(可能有,也可能没有,但从您给出的描述来看,似乎没有)

字符串
“M&Ms\n”
与字符串
“M&Ms”
不同

也有可能其中一个字符串的末尾有额外的空格

在for循环开始时,使用以下方法去除所有多余的空格和换行符:

for line in myInput:
    line = line.strip()
    # etc

行的末尾有一个行尾字符(
“\n”
),这是您在替换行进行打印时注意到的。文件中的最后一行可能没有(可能有,也可能没有,但从您给出的描述来看,似乎没有)

字符串
“M&Ms\n”
与字符串
“M&Ms”
不同

也有可能其中一个字符串的末尾有额外的空格

在for循环开始时,使用以下方法去除所有多余的空格和换行符:

for line in myInput:
    line = line.strip()
    # etc

您的文件是否以换行结尾?我猜可能不是,这可以解释这一点。你不需要第二个if条件;在有条件地执行第一个块后,它将始终为真。@谢谢您指出:)是的,致命的,它不会以换行结束。您的文件是否以换行结束?我猜可能不是,这可以解释这一点。你不需要第二个if条件;在有条件地执行第一个块之后,它将始终是真的。@APerson感谢您指出:)是的,致命的,它不会以一个新行结束。这就是问题所在!我还不知道strip函数,这比.replace('\n',“”)好得多。
strip
解决了这个问题,但是OP可能希望通过执行
candyDict=collections.Counter(line.strip()表示myInput中的line)
查看这里的文档:。当您的代码运行时,您还需要查找collections.defaultdict,最后是collections.Counter,以便将整个过程变成一个两行程序:-)太棒了,这就是问题所在!我还不知道strip函数,这比.replace('\n',“”)好得多。
strip
解决了这个问题,但是OP可能希望通过执行
candyDict=collections.Counter(line.strip()表示myInput中的line)
查看这里的文档:。当代码运行时,还需要查找collections.defaultdict,最后是collections.Counter,以将整个过程转换为两行代码:-)