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]的副本时我会使用第二个列表在结果之间有所不同,但在我的完整数据集中没有很多重复,所以它只是在特定情况下引用。)
答案 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}} ....你说你已经有了搜索功能。它可以使用哪些数据结构?