使用Python值组合三个词典

时间:2016-11-18 20:20:49

标签: python dictionary

使用词典时出现问题。

这是我的问题。

我有三个表,需要创建第四个表,将前三个中的所有信息分组。

文件1:包含table4感兴趣的键。
file1.txt:
a   namex   23  14
b   nameY   30  18
c   nameZ   10  20
文件2:根据[2]从[1]和[3]收集信息。 生成这样的字典:

DICT2 = {'X':['nameX','infoX'],'Y':['nameY','infoY'],'Z':['nameZ','infoZ']}

file2.txt:
[0]     [1]     [2] [3]     [4] [5] 
idX     nameX   X   infoX   ... descriptionX 
idY     nameY   Y   infoY   ... descriptionY
idZ     nameZ   Z   infoZ   ... descriptionZ
文件3:用于附加到DICT1末尾的'a','b'和'c'的值。
file3.txt
a   1   0   1   0   0
b   0   3   8   2   0
c   3   5   3   4   1
我的剧本:
file1 = open('file1.txt', 'r')
file2 = open('file2.txt', 'r')
file3 = open('file3.txt', 'r')

DICT1 = {}
DICT2 = {}
DICT3 = {}

for line in file1:
    row = line.strip().split('\t')
    if row[0] not in DICT1:
        DICT1[row[0]] = row[1:]

for line2 in file2:
    row2 = line2.strip().split('\t')
    if row2[1] not in DICT2:
        DICT2[row2[1]] = row2[2], row2[5]

for line3 in file3:
    row3 = line3.strip().split('\t')
    name = line3[0].strip()
    count = line3[1:]
    if name not in DICT3:
               DICT3[name] = count
               if name in DICT1 and DICT2:

     print(name + '\t' + DICT2[key] + str('\t'.join(count)) + '\t' + 
                                        str('\t'.join(DICT1[name])))

当我尝试将DICT3的值包含在打印中时,DICT2的第一个键重复到所有(表中的X):

a   X   1   0   1   0   0   nameX   23  14
b   X   0   3   8   2   0   nameY   30  18
c   X   3   5   3   4   1   nameZ   10  20

我想获得的输出如下:

a   X   1   0   1   0   0   nameX   23  14
b   Y   0   3   8   2   0   nameY   30  18
c   Z   3   5   3   4   1   nameZ   10  20

提前谢谢你。

1 个答案:

答案 0 :(得分:0)

让我们先开始清理代码,看看我们是否可以到达你想要的地方

首先,您有包含分隔数据的文本文件。无论何时,只要您查看它,就应该依靠csv模块来解析它。如果你有一个为你做的stdlib模块,请不要尝试按行读取并使用分隔符进行拆分。实现意外的实施错误太容易了。

其次,使用with关键字打开您的文件。这使您不必在以后关闭它们(并且可能忘记),这只是一种很好的做法。

import csv

with open("file1.txt") as file1, open("file2.txt") as file2, \
     open("file3.txt") as file3:
    readers = [csv.reader(f, delimiter="\t") for f in [file1, file2, file3]]
    # readers[0] is file1
    # readers[1] is file2
    # readers[2] is file3

现在让我们来看看你是如何创建这些词典的。那里有很多if key not in dict: dict[key] = data。你实际认为你有重复的数据并且试图忽略其余的数据吗?如果是这样,好的,继续这样做!如果没有,请放弃并执行:

    # still inside the `with` block from the last snippet

    dicts = []
    dicts.append({k: vs for k, *vs in readers[0]})
    dicts.append({one: (two, five) for _, one, two, _, _, five, *_ in readers[1]}
    dicts.append({k: vs for k, *vs in readers[2]})
    # dicts[0] is DICT1
    # dicts[1] is DICT2
    # dicts[2] is DICT3

现在我们已将所有数据制成表格,我们可以生成输出:

# no longer need to be inside the `with` block

result = [[abbr, dicts[1][name][0], *dicts[2][abbr], name, *vs] for abbr, (name, *vs) in dicts[0].items()]

那个古老丑陋的东西应该会给你正确的结果,尽管你必须加入字符串才能做到。

for row in result:
    print("\t".join(row))

您的代码

您的代码存在许多错误,因此很难分解出错的确切方法。最终打印行中DICT2.key[]之类的内容可能是DICT2.keys(),但应该抛出您未报告的错误消息,如果提供的代码不是,我会毫不犹豫地猜测出了什么问题。 #39;编写的代码!