替换Python dict中的值

替换Python dict中的值,python,dictionary,Python,Dictionary,我有2个文件,只有2列 A 2 B 5 C 6 第一列是字母 A cat B dog C house 我想用第一个文件中对应的数字替换第二个文件中的字母,这样我就可以得到 2 cat 5 dog 6 house 我从第一张纸上写了一张口述,然后读了第二张。我试过几件事,但都不管用。我似乎无法取代这些价值观 import csv with open('filea.txt','rU') as f: reader = csv.reader(f, delimiter

我有2个文件,只有2列

A   2
B   5
C   6
第一列是字母

A  cat
B  dog
C  house
我想用第一个文件中对应的数字替换第二个文件中的字母,这样我就可以得到

2  cat
5  dog
6  house
我从第一张纸上写了一张口述,然后读了第二张。我试过几件事,但都不管用。我似乎无法取代这些价值观

import csv
with open('filea.txt','rU') as f:
    reader = csv.reader(f, delimiter="\t")
    for i in reader:
        print i[0]  #reads only first column
        a_data = (i[0])


dictList = []
with open('file2.txt', 'r') as d:
        for line in d:
            elements = line.rstrip().split("\t")[0:]
            dictList.append(dict(zip(elements[::1], elements[0::1])))

for key, value in dictList.items():
            if value == "A":
                    dictList[key] = "cat"

你可以使用字典理解:

d1 = {'A':2,'B':5,'C':6}
d2 = {'A':'cat','B':'dog','C':'house'}

In [23]:  {d1[k]:d2[k] for k in d1.keys()}
Out[23]:  {2: 'cat', 5: 'dog', 6: 'house'}

如果这两个词典分别称为
a
b
,则可以通过以下方式构造新词典:

composed_dict = {a[k]:b[k] for k in a}
这将获取
a
中的所有键,并从
a
b
中读取相应的值以构建新词典

关于您的代码:

  • 变量
    a_data
    没有任何用途。您读取第一个文件,pront第一列,对其中的数据不做任何其他操作
  • zip(元素[::1],元素[0::1])
    只会构造像
    [1,2,3]->[(1,1)、(2,2)、(3,3)]
    这样的对,我想这不是你想要的
  • 毕竟,你有一个字典列表,在最后一行,你只是把字符串放在列表中。我认为这不是故意的

问题似乎出现在您的最后一行:

for key, value in dictList.items():
    if value == "A":
        dictList[key] = "cat"
这应该是:

for key, value in dictList.items():
    if key in a_data:
        dictList[a_data[key]] = dictList[key]
        del dictList[key]

d1 = {'A': 2, 'B': 5, 'C': 6}
d2 = {'A': 'cat', 'B': 'dog', 'C': 'house', 'D': 'car'}

for key, value in d2.items():
    if key in d1:
        d2[d1[key]] = d2[key]
        del d2[key]

>>> d2
{2: 'cat', 5: 'dog', 6: 'house', 'D': 'car'}
请注意,此方法允许第二个字典中没有第一个字典键的项

以条件词典理解格式包装:

>>> {d1[k] if  k in d1 else k: d2[k] for k in d2}
{2: 'cat', 5: 'dog', 6: 'house', 'D': 'car'}
我相信此代码将为您带来理想的结果:

with open('filea.txt', 'rU') as f:
    reader = csv.reader(f, delimiter="\t")
    d1 = {}
    for line in reader:
        if line[1] != "":
            d1[line[0]] = int(line[1])

with open('fileb.txt', 'rU') as f:
    reader = csv.reader(f, delimiter="\t")
    reader.next()  # Skip header row.
    d2 = {}
    for line in reader:
        d2[line[0]] = [float(i) for i in line[1:]]

d3 = {d1[k] if k in d1 else k: d2[k] for k in d2}

我得到了AttributeError:'list'对象没有属性'items',这是因为dictList实际上是一个列表,而不是一个字典。你能从这两个网站上发布一个小样本的数据吗?当然可以。我会发布文件链接。我刚刚编辑了文件B,其中包含了将该文件作为字典读取的代码(上面示例中的d1)。我认为这是我的主要问题之一。你看fileA有100列,所以我想确保dict只看第一列,而不浪费时间和其他列在一起。zip(elements[::1],elements[0::1])给我的是从第二个文件中获取列0和1,并将其构造为:2,因此我会有一个dict。我想我可能把事情搞糊涂了。我会重新开始。Thanks@CarolM你想用第一个文件的第一列做什么?在这个文件中,我需要替换第一列中数字的字母。@CarolM好了,现在我们知道哪个文件包含什么了。你的输出是什么?字典?新文件?覆盖原始文件?计划覆盖原始文件。
with open('filea.txt', 'rU') as f:
    reader = csv.reader(f, delimiter="\t")
    d1 = {}
    for line in reader:
        if line[1] != "":
            d1[line[0]] = int(line[1])

with open('fileb.txt', 'rU') as f:
    reader = csv.reader(f, delimiter="\t")
    reader.next()  # Skip header row.
    d2 = {}
    for line in reader:
        d2[line[0]] = [float(i) for i in line[1:]]

d3 = {d1[k] if k in d1 else k: d2[k] for k in d2}