0

我在一个文件中有两列,格式如下:

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

等等....

我想通过组合第一列和第二列并将第三列作为值来创建一个键。我正在尝试这种方式。这是唯一的部分代码:

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

我面临一个错误“TypeError:不可散列的类型:'list'”。我在哪里做错了?几分钟前我刚刚发布了一个问题。抱歉,这么快就发帖太急了,但情况紧急。

4

4 回答 4

2

ampdu是一个列表列表,所以当你使用时,join你试图加入文件的第一行和第二行。尝试遍历该列表以单独获取每一行。

for columns in ampdu:

您也可以使用元组而不是连接来制作密钥。

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

ampdu是一个列表列表:

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

所以你ampdu[0]实际上是文件的第一行,ampdu[1]第二行等等。

你得到 a 的原因TypeError: unhashable type: list是因为字典要求它们的键是可散列的文档

此外,就像Mark提到的那样,您可以使用元组而不是将它们加入字符串中,并且您可以利用解包将代码缩短为如下所示:

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 回答
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 回答
0
with open('file') as f:
    lines = (line.split() for line in f)
    maindict = dict(('-'.join([line[0], line[1]]), line[2]) for line in lines)
于 2013-06-25T06:06:03.763 回答