用Python字典替换值

3

我有2个文件,first 只有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"
4个回答

3
您可以使用字典推导式:
```python ```
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'}

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' object has no attribute 'items'。 - Carol M
这是因为dictList确实是一个列表而不是字典。你能否发布一些来自两者的小样本数据? - Alexander
好的,我会把文件链接发布在这里。https://drive.google.com/file/d/0Bzv1SNKM1p4uV1ZNOE9ZVTc2dkk/view?usp=sharing - Carol M
请下载文件B:https://drive.google.com/file/d/0Bzv1SNKM1p4uZXJ2djBhMTlNX2c/view?usp=sharing - Carol M
我刚刚编辑了代码,将该文件读取为字典(在上面的示例中为d1)。 - Alexander
是的,很棒。谢谢。 - Carol M

1
如果两个字典分别被称为ab,你可以通过以下方式构建一个新的字典:
composed_dict = {a[k]:b[k] for k in a}

这将获取a中的所有键,并从ab读取相应的值以构建一个新字典。
关于你的代码:
- 变量a_data没有用处。你读取了第一个文件,打印了第一列,但没有对其中的数据做任何处理。 - zip(elements[::1], elements[0::1])只会构造像[1,2,3] -> [(1,1),(2,2),(3,3)]这样的对,我认为这不是你想要的。 - 最后你有一个字典列表,在最后一行你只是把字符串放进了那个列表里。我认为这不是你的意图。

我认为这是我的主要问题之一。你看,fileA有100列,所以我想确保dict只查看第一个列而不浪费时间查看其他的列。zip(elements[::1], elements[0::1])应该从第二个文件中取出列0和1并将其构建为A:2,以此来生成一个字典。我想我可能把事情搞混了。我会重新开始。谢谢。 - Carol M
@CarolM,您想要使用第一个文件的第一列做什么? - Tamas Hegedus
那是我需要在第一列中将字母替换为数字的文件。 - Carol M
@CarolM 好的,现在我们知道哪个文件包含什么了。那你的输出是什么?字典?新文件?覆盖原文件? - Tamas Hegedus
计划是覆盖原始文件。 - Carol M

1
import re

d1 = dict()
with open('filea.txt', 'r') as fl:
    for f in fl:
        key, val = re.findall('\w+', f)
        d1[key] = val

d2 = dict()
with open('file2.txt', 'r') as fl:
    for f in fl:
        key, val = re.findall('\w+', f)
        d2[key] = val

with open('file3.txt', 'wb') as f:
    for k, v in d1.items():
        f.write("{a}\t{b}\n".format(a=v, b=d2[k]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接