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

Associating list value in python dictionary with relevant key

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

样本输入:

1
2
3
4
5
6
7
8
cat tail
cat whisker
cat meow
cat black
dog tail
dog paw
dog bark
bird    beak

我已经编写了以下代码,它生成了一个(尽管错误)输出,其中包含我要查找的字典格式,它将col1中的一个键与col2中的所有值关联起来。

我一直使用的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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一起,都使我得到了相同的输出,而不是期望的输出。

实际输出为:

1
2
3
4
5
6
7
8
{'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']}

所需输出为

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

有人能指出我在哪里犯了一个错误或有一个更全面的解决方案,以便最终的结果是one字典吗?


您可以检查键是否存在,如果存在,则追加,如果不存在,则使用单个元素创建一个列表:

1
2
3
4
5
6
7
8
9
10
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

输出:

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

熊猫:

1
2
3
4
import pandas as pd

df = pd.read_csv('file_name', header=None, sep='\s+')
print df.groupby(0)[1].apply(list).to_dict()

输出:

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


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

您也可以使用来自itertools模块的groupby,如下示例:

1
2
3
4
5
6
7
8
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)

输出:

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


这可以用默认的defaultdict来解决。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from collections import defaultdict

def main():
    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 = defaultdict(list)
        for k,v in zip(keys, values):
            d[k].append(v)
        print(dict(d))

if __name__ =="__main__": main()

输出:

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

假设您已将输入拆分为""

1
2
3
4
5
6
7
 d = {}
 tab = ['cat tail', 'cat whisker', 'cat meow', 'cat black', 'dog tail', 'dog paw', 'dog bark', 'bird beak']
 for i  in tab:
    try:
        d[i.split("")[0]] += [i.split("")[1]]
    except KeyError:
        d[i.split("")[0]] = [i.split("")[1]]

输出

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