字典中的文字不起作用

时间:2016-07-10 12:44:22

标签: python dictionary

我在Python代码所在的文件夹中有以下文本文件。

78459581
Black Ballpoint Pen
12345670
Football
49585922
Perfume
83799715
Shampoo

我已经编写了这个Python代码。

file = open("ProductDatabaseEdit.txt", "r")
d = {}
for line in file:
    x = line.split("\n")
    a=x[0]
    b=x[1]
    d[a]=b

print(d)

这是我收到的结果。

b=x[1]  # IndexError: list index out of range

我的词典应如下所示:

{"78459581" : "Black Ballpoint Pen"
 "12345670" : "Football"
 "49585922" : "Perfume"
 "83799715" : "Shampoo"}

我做错了什么?

7 个答案:

答案 0 :(得分:5)

一行以换行符终止,因此line.split("\n")永远不会给您多行。

你可以作弊并做:

for first_line in file:
    second_line = next(file)

答案 1 :(得分:3)

您可以使用dictionary generator来简化您的解决方案,这可能是我能想到的最灵活的解决方案:

>>> with open("in.txt") as f:
...   my_dict = dict((line.strip(), next(f).strip()) for line in f)
... 
>>> my_dict
{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}

其中in.txt包含问题中描述的数据。必须strip()每一行,否则您的密钥和值将留下尾随\n字符。

答案 2 :(得分:2)

您需要删除\ n,而不是拆分

file = open("products.txt", "r")
d = {}
for line in file:
    a = line.strip()
    b = file.next().strip()
    # next(file).strip() # if using python 3.x
    d[a]=b

print(d)

{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}

答案 3 :(得分:1)

正在进行什么

当你打开一个文件时,你会得到一个迭代器,当你在 for 循环中使用它时,它会一次给你一行。

您的代码正在对文件进行迭代,将\n作为分隔符拆分列表中的每一行,但是会为您提供仅包含一个项目的列表:您已经在同一行了。然后您尝试访问列表中的第二项,该项目不存在。这就是您获得IndexError: list index out of range的原因。

如何解决

你需要的是:

file = open('products.txt','r')
d = {}
for line in file:
    d[line.strip()] = next(file).strip()

在每个循环中,您向字典添加一个新键(通过为尚未存在的键指定值)并将下一行指定为值。 next()函数只是告诉file迭代器"请转到下一行" 。因此,要驱动点回家:在第一个循环中,将第一行设置为键,并将第二行指定为值;在第二次循环迭代中,将第三行设置为键,并将第四行指定为值;等等。

每次需要使用.strip()方法的原因是因为您的示例文件在每一行的末尾都有一个空格,因此该方法将删除它。

或者...

您还可以使用词典理解获得相同的结果:

file = open('products.txt','r')
d = {line.strip():next(file).strip() for line in file}

基本上,是上述相同代码的较短版本。它更短,但可读性更低:不一定是你想要的东西(品味)。

答案 4 :(得分:0)

在我的解决方案中,我试图不使用任何循环。因此,我首先使用pandas加载txt数据:

import pandas as pd
file = pd.read_csv("test.txt", header = None)

然后我为dict分隔键和值,例如:

keys, values = file[0::2].values, file[1::2].values

然后,我们可以将这两个作为列表直接压缩并创建一个词典:

result = dict(zip(list(keys.flatten()), list(values.flatten())))

要创建此解决方案,我使用了[问题]中提供的信息:How to remove every other element of an array in python? (The inverse of np.repeat()?)和[问题]:Map two lists into a dictionary in Python

答案 5 :(得分:0)

您可以一次循环列表两个项目:

file = open("ProductDatabaseEdit.txt", "r")
data = file.readlines()
d = {}

for line in range(0,len(data),2):
    d[data[i]] = data[i+1]

答案 6 :(得分:0)

尝试此代码(数据位于 /tmp/tmp5.txt 中):

#!/usr/bin/env python3

d = dict()
iskey = True
with open("/tmp/tmp5.txt") as infile:
    for line in infile:
        if iskey:
            _key = line.strip()
        else:
            _value = line.strip()
            d[_key] = _value
        iskey = not iskey

print(d)

这给了你:

{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}