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 つのリストになります。私はそのように持っていたので、国を選択すると、ポップとエリアに関する対応する情報が表示されます。辞書の方が優れていると言う人もいますが、まず第一に、辞書の 1 つの場所に 3 つのことを入れることができるとは思いません。国名をキーにして、人口と地域をそのキーの情報にする必要があります。2つの辞書はおそらく機能しますか?しかし、ファイルから辞書に取得する方法がわかりません。何か助けてください。

4

4 に答える 4

2

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

一般に、2つ以上のアイテムを格納しているものを超えたら、ネストされた辞書のようなものよりもクラスをお勧めします。これらにより、コードが読みやすくなり、後で拡張しやすくなります。

ただし、ほとんどのプログラミングの問題と同様に、他のアプローチも機能します。これは、最適な方法を選択する場合です。

于 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}

各行に区切られた項目が 3 つ以上または 3 つ以下の場合にコードが壊れないように、エラー チェックを追加する必要があることに注意してください。

次のように値にアクセスできます。

>>> myDict['Mordor']['area']
175000
>>> myDict['Mordor']['population']
3000000
于 2013-02-26T21:46:57.743 に答える
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})

その場合、データは辞書のリストになります。

しかし、それがより多くのメモリを使用するため、それが本当に良いアプローチであるかどうかはわかりません。もう1つのオプションは、リストのリストです。

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

辞書の値は、人口と地域情報のタプルにすることができます。したがって、ファイルを読み込むと、次のようなことができます

countries_dict = {}

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