Python 有人能解释一下字典如何在一个键下保存不同的输入值吗

Python 有人能解释一下字典如何在一个键下保存不同的输入值吗,python,python-2.7,Python,Python 2.7,我有一个简单的循环代码,它接收一行用户输入,并(在将其放入列表后)将单个单词作为键放入字典中,其中lineCount number是值。有人能解释一下如何调整这个值,以便在不同的行中输入相同的单词时,它不会替换字典值,而只是添加到字典值中吗 import string lineCount = 1 q = raw_input("enter something") d = {} while q != "no": q = q.split() for word in q:

我有一个简单的循环代码,它接收一行用户输入,并(在将其放入列表后)将单个单词作为键放入字典中,其中lineCount number是值。有人能解释一下如何调整这个值,以便在不同的行中输入相同的单词时,它不会替换字典值,而只是添加到字典值中吗

import string
lineCount = 1
q = raw_input("enter something")
d = {}

while q != "no":
    q = q.split()
    for word in q:
        d[word] = lineCount
    lineCount += 1
    q = raw_input("enter something")

print d
例如,如果第1行的输入为“x y”,第2行的输入为“x n”,则字典应打印为“x:1,2 y:1 n:2”,但当前仅打印“x:2 y:1 n:2”,因为替换了与键x关联的原始行计数值。如果可能,请避免在解决方案中导入集合,因为我宁愿先了解最长的方法。
非常感谢。

您可以使用get if默认值,如以下代码所示:

lineCount = 1
q = raw_input("enter something")
d = {}

while q != "no":
    q = q.split()
    for word in q:
        d[word] = d.get(word, 0) + 1
    lineCount += 1
    query = raw_input("enter something")

第一次添加单词时,get将找不到该单词,并返回0(默认值)。因此,您可以将其与1一起添加以更新结果。

如果默认值如下所示,则可以使用get:

lineCount = 1
q = raw_input("enter something")
d = {}

while q != "no":
    q = q.split()
    for word in q:
        d[word] = d.get(word, 0) + 1
    lineCount += 1
    query = raw_input("enter something")

第一次添加单词时,get将找不到该单词,并返回0(默认值)。如果你真的想使用字典而不是ettanany建议的列表,我建议你使用行作为键,单词作为值,因为行是唯一的,单词不是。我相信您不需要代码示例就可以解决这个问题:)

如果您真的想使用字典而不是ettanany建议的列表,我建议您使用行作为键,使用单词作为值,因为行是唯一的,而单词不是唯一的。我相信您不需要代码示例就可以解决此问题:)

使用字典值列表,您可以获得以下解决方案:

line_count = 1
q = raw_input("enter something: ")
d = {}

while q != "no":
    words = q.split()
    for word in words:
        if word in d and line_count not in d[word]:
            d[word].append(line_count)
        else:
            d[word] = [line_count]
    line_count += 1
    q = raw_input("enter something: ")

print d
输出示例:

>>> python word_lines.py
enter something: hello world
enter something: hello
enter something: world
enter something: sof
enter something: no
{'world': [1, 3], 'hello': [1, 2], 'sof': [4]}

使用字典值列表,可以获得以下解决方案:

line_count = 1
q = raw_input("enter something: ")
d = {}

while q != "no":
    words = q.split()
    for word in words:
        if word in d and line_count not in d[word]:
            d[word].append(line_count)
        else:
            d[word] = [line_count]
    line_count += 1
    q = raw_input("enter something: ")

print d
输出示例:

>>> python word_lines.py
enter something: hello world
enter something: hello
enter something: world
enter something: sof
enter something: no
{'world': [1, 3], 'hello': [1, 2], 'sof': [4]}


为什么不使用列表存储值?例如,
'x':[1,2]
一个列表就可以了,但由于我希望这段代码能够处理每行较长的句子,所以我认为字典解决方案更合适。x和y只是一个例子,它仍然是一本字典,但字典中的值是行号列表。@user7222454我不是要用列表替换你的字典,只是你的字典项的值是这样的
{x':[1,2],'y':[1]}
哦,对了,我明白了。那么,一段示例代码是什么样子的呢?为什么不使用列表来存储您的值呢?例如,
'x':[1,2]
一个列表就可以了,但由于我希望这段代码能够处理每行较长的句子,所以我认为字典解决方案更合适。x和y只是一个例子,它仍然是一本字典,但字典中的值是行号列表。@user7222454我不是要用列表替换你的字典,只是你的字典项的值是这样的
{x':[1,2],'y':[1]}
哦,对了,我明白了。那么一段示例代码会是什么样子呢?我刚刚运行了这个程序,它给了我一个相同的问题,即如果输入twice将循环中的行更改为:
d[word]=d.get(word,[])+[lineCount],x只与其最近的值相关联
每个键处的值将是它所在行的列表。我刚刚运行了这个,它给了我一个相同的问题,即如果输入twice将循环中的行更改为:
d[word]=d.get(word,[])+[lineCount,x只与其最近的值关联
每个键上的值将是它所在行的列表。谢谢,这正是我要找的!:)如果不太麻烦的话,我有一个快速跟进;在一行中处理同一个单词需要做哪些调整?i、 e.如果第1行的输入是“hello hello world”,第2行的输入是“world”,而不是打印为{'hello':[1,1,2],'world':[2]}的值,它只打印{'hello':[1,2],'world':[2]}。提前感谢您只需在您的情况下添加以下内容:
如果d中的单词和d中的行不算[word]
,请查看我编辑的答案。您还可以使用自动删除的集合duplicates@ettanany非常感谢,这有助于我理解更多的东西。谢谢,这正是我想要的!:)如果不太麻烦的话,我有一个快速跟进;在一行中处理同一个单词需要做哪些调整?i、 e.如果第1行的输入是“hello hello world”,第2行的输入是“world”,而不是打印为{'hello':[1,1,2],'world':[2]}的值,它只打印{'hello':[1,2],'world':[2]}。提前感谢您只需在您的情况下添加以下内容:
如果d中的单词和d中的行不算[word]
,请查看我编辑的答案。您还可以使用自动删除的集合duplicates@ettanany非常感谢,这有助于我了解更多