0

以下の形式のファイルに 2 つの列があります。

00:01:02   aa:bb:cc  1
03:04:05   dd:ee:ff  2

等々....

1列目と2列目を組み合わせてキーを作り、3列目を値にしたいです。私はこのように努力しています。これは唯一の部分的なコードです:

 maindict = dict()
 lines = inf.readlines()
 ampdu = [x.split() for x in lines]
 ckey = '-'.join([ampdu[0],ampdu[1]])
 maindict[ckey] = ampdu[2]  

「TypeError: unhashable type: 'list'」というエラーに直面しています。私はどこで間違っていますか?数分前に質問を投稿しました。申し訳ありませんが、これはすぐに投稿するのに必死でしたが、それは一種の緊急事態です.

4

4 に答える 4

2

Yourampduはリストのリストなので、 を使用joinすると、ファイルの 1 行目と 2 行目を結合しようとしています。そのリストを繰り返し処理して、各行を個別に取得してみてください。

for columns in ampdu:

また、結合の代わりにタプルを使用してキーを作成することもできます。

ckey = (columns[0], columns[1])
于 2013-06-24T22:46:39.497 に答える
1

operator.itemgetterタプルを返すことを利用して、.split()最初にファイルに対してジェネレーターを構築し、次にそれに対してジェネレーターを構築するのが最も簡単です。次にdict-comp例を示します。

from operator import itemgetter

get_key = itemgetter(0, 1)
with open('yourfile') as fin:
    rows = (line.split() for line in fin)
    maindict = {get_key(row):row[2] for row in rows}

また、必要に応じて再利用できるという利点もありget_keyます。

于 2013-06-24T23:31:26.757 に答える
1

あなたampduはリストのリストです:

ampdu = [x.split() for x in lines]

あなたampdu[0]は実際にはあなたのファイルの最初の行、ampdu[1]あなたの2行目などです.

を取得している理由TypeError: unhashable type: listは、ディクショナリがキーをハッシュ可能なドキュメントにする必要があるためです。

また、マークが述べたように、タプルを文字列に結合する代わりに使用でき、アンパックを利用してコードを次のように短縮できます。

inf = open("foo.txt", "r")
maindict = {}

for line in inf:
    col1, col2, val = line.split()
    maindict[(col1, col2)] = val

辞書は次のようになります。

>> print maindict
>> {('00:01:02', 'aa:bb:cc'): '1', 
    ('03:04:05', 'dd:ee:ff'): '2'}

値にアクセスするには、maindict[(col1, col2)] を使用できます。

>> maindict[('03:04:05', 'dd:ee:ff')]
   2
于 2013-06-24T23:27:10.800 に答える