将python字典中的列表值与相关键关联

将python字典中的列表值与相关键关联,python,dictionary,Python,Dictionary,我有一个两列选项卡分隔的输入,我想在python中填充一个字典。第一列与键关联(存在重复项),第二列与值关联 样本输入: cat tail cat whisker cat meow cat black dog tail dog paw dog bark bird beak 我编写了以下代码,它生成了一个(尽管是错误的)输出,其中包含我正在寻找的字典格式,它将col1中的one键与其在col2中的所有值关联起来 我一直使用的代码是: #!/usr/bin/python # -*- codi

我有一个两列选项卡分隔的输入,我想在
python
中填充一个字典。第一列与键关联(存在重复项),第二列与值关联

样本输入:

cat tail
cat whisker
cat meow
cat black
dog tail
dog paw
dog bark
bird    beak
我编写了以下代码,它生成了一个(尽管是错误的)输出,其中包含我正在寻找的字典格式,它将col1中的one键与其在col2中的所有值关联起来

我一直使用的代码是:

#!/usr/bin/python
# -*- coding: utf-8 -*-

keys = []
values = []

with open('animal-trial', "rU") as f:
    for line in f:
        line = line.split()
        keys.append(line[0])
        values.append(line[1])
    d = {}
    for k,v in zip(keys, values):
        d.setdefault(k, []).append(v)
    print d
我查阅了其他参考资料,但是,所有的建议,包括使用
defaultdicts
将我带到相同的输出,而不是期望的输出

实际输出为:

{'cat': ['tail']}
{'cat': ['tail', 'whisker']}
{'cat': ['tail', 'whisker', 'meow']}
{'cat': ['tail', 'whisker', 'meow', 'black']}
{'dog': ['tail'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'dog': ['tail', 'paw'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
所需的输出为

{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} 

有人能告诉我哪里出错或有更全面的解决方案,以便最终结果是
one
dictionary吗?

您可以检查键是否存在,如果存在,则追加,如果没有,则创建一个包含单个元素的列表:

d = {}
with open('a12', 'r') as f:
    for line in f:
        if line.strip():
            a = line.split()
            if a[0] not in d:
                d[a[0]] = [a[1]]
            else:
                d[a[0]].append(a[1])
print d
输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}
{'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}

熊猫: 输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}
{'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}

您可以检查键是否存在,如果存在,则添加,如果不存在,则创建一个包含单个元素的列表:

d = {}
with open('a12', 'r') as f:
    for line in f:
        if line.strip():
            a = line.split()
            if a[0] not in d:
                d[a[0]] = [a[1]]
            else:
                d[a[0]].append(a[1])
print d
输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}
{'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}

熊猫: 输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}
{'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}

我假设您有一个名为
f_input.txt
的输入文件

您还可以使用
itertools
模块中的
groupby
,如下示例:

from itertools import groupby

data = list(k.rstrip().split() for k in open("f_input.txt", 'r'))
final = {}
for k, v in groupby(data, lambda x : x[0]):
    final[k] = list(k[1] for k in list(v))

print(final)
输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}
{'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}

我假设您有一个名为
f_input.txt
的输入文件

您还可以使用
itertools
模块中的
groupby
,如下示例:

from itertools import groupby

data = list(k.rstrip().split() for k in open("f_input.txt", 'r'))
final = {}
for k, v in groupby(data, lambda x : x[0]):
    final[k] = list(k[1] for k in list(v))

print(final)
输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}
{'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}

假设您已在“\n”上拆分输入

输出

{'bird':['bike'],'dog':['tail','paw','bark','cat':['tail','sc须','meow','black']}


假设您已在“\n”上拆分输入

输出

{'bird':['bike'],'dog':['tail','paw','bark','cat':['tail','sc须','meow','black']}


这可以用默认的defaultdict解决

代码:

输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}
{'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}

这可以用默认的defaultdict解决

代码:

输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}
{'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}
{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}

你有一本字典。您的缩进必须与您发布的内容不同;您的最终打印语句可能在for循环中。@owwoow14我想您的代码是正确的。缩进语句
print d
您确实有一本字典。您的缩进必须与您发布的内容不同;您的最终打印语句可能在for循环中。@owwoow14我想您的代码是正确的。缩进语句
print d
为什么不使用常规dict?@SembeiNorimaki OK?为什么不使用常规dict?@SembeiNorimaki OK?