有没有办法将列表作为参考属性添加到列表中?

时间:2012-02-05 01:14:36

标签: python

Python新手在这里想知道是否有办法将两个列表组合成一个字典,其中value可以是一个特定的数字。以下是我尝试合并的3个数据集的示例:

[17, 39, 9]  [13, 37, 13]  =  0.13517353359
[17, 39, 9]  [15, 38, 10]  =  0.055003044449
[13, 39, 13]  [13, 37, 13]  =  0.0345037548204
[13, 39, 13]  [15, 38, 10]  =  0.0801704891415
[14, 39, 12]  [13, 37, 13]  =  0.0596711995129
[14, 39, 12]  [15, 38, 10]  =  0.055003044449
[15, 39, 11]  [13, 37, 13]  =  0.0848386442054
[15, 39, 11]  [15, 38, 10]  =  0.0298355997564
[16, 39, 10]  [13, 37, 13]  = 0.110006088898
[16, 39, 10]  [15, 38, 10]  =  0.0298355997564

我真的希望能够对数字进行排序(我有一个功能已经完成了这项工作),并希望通过第一个列表进行查找(但需要第二个列表作为参考)。

我想做name = "%s-%s" % ([16, 39, 10], [15, 38, 10])之类的事情,然后在字典中添加名称(数字是值),但问题是我无法搜索[16,39,10]来获得结果。我可以制作一个类似{[16,39,10]的字典:[[15,38,10],0.0298355997564]}然后我的搜索功能会中断。

我怀疑我可能不得不做一些不可思议的事情,但我想知道是否有更好的方法来解决这个问题?理想情况下,我想要一个像{[16, 39, 10]:0.0298355997564}和[15,38,10]这样的简单字典作为某种属性,我可以在需要时引用它。)

这可能吗?

编辑:更多细节:我需要它(参考,第二个列表),以防我以后需要引用它(在这个具体的例子中,当我遇到[16,39,10]的副本时我会使用第二个列表在结果之间有所不同,但在我的完整数据集中没有很多重复,所以它只是在特定情况下引用。)

4 个答案:

答案 0 :(得分:2)

您需要将列表转换为元组,以便它变得可以使用。

>>> l = [1,2,3]
>>> d = { l: 5 }
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> t = tuple(l)
>>> d = { t: 5 }
>>> d[t]
5

但重新阅读你的问题,这只是战斗的一半。您还希望能够检索第二个列表。

d = { t: (second_list, result) }

然后,当您需要结果或第二个列表时......

other_list, result = d[t]

您可能需要修改搜索功能以考虑从字典中检索的元组而不是单个值。

顺便说一句,如果您的数据集不需要更改(您的两个列表),请考虑将它们设为元组。

答案 1 :(得分:2)

列表不能是字典键,因为它们是可变的。如果数据是静态的,您可以将其转换为元组并将其用作密钥。值也可以是第二个列表和浮点值的元组。

   data = {
        (17, 39, 9):  ([13, 37, 13], 0.13517353359),
        (17, 39, 9):  ([15, 38, 10], 0.055003044449),
        (13, 39, 13):  ([13, 37, 13], 0.0345037548204),
   }

   print "Other list:", d[(17, 39, 9)][0]
   print "Float", d[(17, 39, 9)][1]

答案 2 :(得分:2)

  

我可以制作像[[16,39,10]这样的词典:[[15,38,10],   0.0298355997564]}

不,你不能。 dict键需要可以清洗;列表不可清除。您可以使用元组而不是列表:

>>> x = {[16, 39, 10]:[[15, 38, 10], 0.0298355997564]}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> x = {(16, 39, 10):[[15, 38, 10], 0.0298355997564]}
>>> x
{(16, 39, 10): [[15, 38, 10], 0.0298355997564]}

在元组和冷冻集之间进行选择:frozensets的效率较低。更重要的是,frozensets不保留顺序:

>>> (16, 39, 10) != (10, 39, 16)
True # different
>>> frozenset((16, 39, 10)) != frozenset((10, 39, 16))
False # same!!
  

然后我的搜索功能中断了。

嗯嗯,是的,您需要更改搜索功能。

更新以允许多种重复。

让我们像数据库一样将数据存储在一个表(列表)中,您可以随时使用全表扫描访问它,但我们提供两个索引(默认值),每个外键一个。

代码:

data = [
    ((17, 39, 9), (13, 37, 13), 0.13517353359),
    ((17, 39, 9), (15, 38, 10), 0.055003044449),
    ((13, 39, 13), (13, 37, 13), 0.0345037548204),
    ((13, 39, 13), (15, 38, 10), 0.0801704891415),
    ((14, 39, 12), (13, 37, 13), 0.0596711995129),
    ((14, 39, 12), (15, 38, 10), 0.055003044449),
    ((15, 39, 11), (13, 37, 13), 0.0848386442054),
    ((15, 39, 11), (15, 38, 10), 0.0298355997564),
    ((16, 39, 10), (13, 37, 13), 0.110006088898),
    ((16, 39, 10), (15, 38, 10), 0.0298355997564),
]

from collections import defaultdict
keydict1 = defaultdict(list)
keydict2 = defaultdict(list)
for row_index, row in enumerate(data):
    tup1, tup2, value = row
    keydict1[tup1].append(row_index)
    keydict2[tup2].append(row_index)

def search(keydict, query_tuple):
    print
    print "looking for", query_tuple
    for row_index in keydict[query_tuple]:
        print row_index, data[row_index]

search(keydict1, (17, 39, 9))
search(keydict2, (13, 37, 13))

输出:

looking for (17, 39, 9)
0 ((17, 39, 9), (13, 37, 13), 0.13517353359)
1 ((17, 39, 9), (15, 38, 10), 0.055003044449)

looking for (13, 37, 13)
0 ((17, 39, 9), (13, 37, 13), 0.13517353359)
2 ((13, 39, 13), (13, 37, 13), 0.0345037548204)
4 ((14, 39, 12), (13, 37, 13), 0.0596711995129)
6 ((15, 39, 11), (13, 37, 13), 0.0848386442054)
8 ((16, 39, 10), (13, 37, 13), 0.110006088898)

答案 3 :(得分:0)

这会浪费太多空间,但你可以使用两个不同的dict,每个{(17,39,10): 0.13517353359, ...} 由你的第一组数字引用。

{(17,39,10):   [13, 37, 13], ... }

tuple

请注意,您需要使用dict作为键而不是列表,因为密钥需要是可清除的。

啊哈,但我刚注意到你有重复的键,不同的数字和列表被引用。所以你不能使用普通的{{1}} ....你说你已经有了搜索功能。它可以使用哪些数据结构?