1

我想知道是否有一种方法可以将分隔文本读入字典。我已经能够将它放入列表没问题这里是代码:

def _demo_fileopenbox():        
    msg  = "Pick A File!"
    msg2 = "Select a country to learn more about!"
    title = "Open files"
    default="*.py"
    f = fileopenbox(msg,title,default=default)
    writeln("You chose to open file: %s" % f)
    c = []
    a = []
    p = []

    with open(f,'r') as handle:
        reader = csv.reader(handle, delimiter = '\t')  
        for row in reader:
            c = c + [row[0]]
            a = a + [row[1]]
            p = p + [row[2]]
        while 1:
            reply = choicebox(msg=msg2, choices= c )
            writeln( reply + ";\tArea: " + a[(c.index(reply))] + " square miles \tPopulation: " + p[(c.index(reply))] )

该代码使其成为 3 个列表,因为每一行文本都是一个国家名称、地区和人口。我就是这样,所以如果我选择一个国家,它会给我有关流行和地区的相应信息。有人说字典是更好的方法,但首先我不认为我可以将三件事放在字典中的一个位置。我需要国家名称作为键,然后人口和地区是该键的信息。2个字典可能有用吗?但我只是不知道如何从文件到字典,有什么帮助吗?

4

4 回答 4

2

您可以使用两个字典,但也可以使用这样的 2 元组:

countries = {}

# ... other code as before

    for row in reader:
        countries[row[0]] = (row[1], row[2])

然后你可以像这样遍历它:

for country, (area, population) in countries.iteritems():
    # ... Do stuff with country, area and population

...或者您可以访问特定国家/地区的数据,如下所示:

area, population = countries["USA"]

最后,如果您打算在将来添加更多信息,您可能希望使用类作为保存信息的更优雅的方式 - 这使得编写在添加新内容时不会中断的代码变得更加容易。你会有这样的课程:

class Country(object):

    def __init__(self, name, area, population):
        self.name = name
        self.area = area
        self.population = population

然后您的阅读代码将如下所示:

for row in reader:
    countries[row[0]] = Country(row[0], row[1], row[2])

或者,如果您让构造函数采用整行而不是单个项目,您可能会发现以后扩展格式更容易,但您也将类更紧密地耦合到文件中的表示。这仅取决于您认为以后如何扩展内容。

然后你可以这样查找:

country = countries["USA"]
print "Area is: %s" % (country.area,)

这样做的好处是您可以添加新的方法来在将来做更聪明的事情。例如,返回人口密度的方法:

class Country(object):

# ...

    def get_density(self):
        return self.population / self.area

一般来说,一旦您超出了存储多个项目的范围,我会推荐使用嵌套字典之类的类。它们使您的代码更易于阅读并且以后更易于扩展。

然而,与大多数编程问题一样,其他方法也可以使用 - 这是选择最适合您的方法的情况。

于 2013-02-26T21:52:48.277 回答
1

像这样的东西应该工作:

from collections import defaultdict

myDict = {}
for row in reader:
    country, area, population = row
    myDict[country] = {'area': area, 'population': population}

请注意,您必须添加一些错误检查,以便在每行中有大于或小于三个分隔项时您的代码不会中断。

您可以按如下方式访问这些值:

>>> myDict['Mordor']['area']
175000
>>> myDict['Mordor']['population']
3000000
于 2013-02-26T21:46:57.743 回答
0

字典的值可以是人口和地区信息的元组。所以当你读入文件时,你可以做一些事情,比如

countries_dict = {}

for row in reader:
        countries_dict[row[0]] = (row[1],row[2])
于 2013-02-26T21:46:49.760 回答
0
data = []

with open(f,'r') as handle:
    reader = csv.reader(handle, delimiter = '\t')  
    for row in reader:
        (country, area, population) = row
        data.append({'country': country, 'area': area, 'population': population})

然后数据将是一个字典列表

但我不确定这真的是一个更好的方法,因为它会使用更多的内存。另一个选项只是列表列表:

data = list(csv.reader(open(f), delimiter='\t'))
print data
# [['USA', 'big', '300 million'], ...]
于 2013-02-26T21:50:20.737 回答