将字典应用于列表以输出集合

时间:2015-02-24 18:18:17

标签: python dictionary set

我有一个包含24个条目的字典,它将每个数字从0到23映射到一个列表:

{0: [5, 1, 2, 3, 4], 1: [5, 1, 2, 4, 3], 2: [5, 1, 3, 2, 4], 3: [5, 1, 3, 4, 2], 4: [5, 1, 4, 2, 3], 5: [5, 1, 4, 3, 2], 6: [5, 2, 1, 3, 4], 7: [5, 2, 1, 4, 3], 8: [5, 2, 3, 1, 4], 9: [5, 2, 3, 4, 1], 10: [5, 2, 4, 1, 3], 11: [5, 2, 4, 3, 1], 12: [5, 3, 1, 2, 4], 13: [5, 3, 1, 4, 2], 14: [5, 3, 2, 1, 4], 15: [5, 3, 2, 4, 1], 16: [5, 3, 4, 1, 2], 17: [5, 3, 4, 2, 1], 18: [5, 4, 1, 2, 3], 19: [5, 4, 1, 3, 2], 20: [5, 4, 2, 1, 3], 21: [5, 4, 2, 3, 1], 22: [5, 4, 3, 1, 2], 23: [5, 4, 3, 2, 1]}

然后我想要一个24 0和1的列表看起来像:

[1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

然后我想打印一个只有字典中列表的列表,这些列表对应于24个长0和1的列表中的1的索引

因此,在上面的示例中,它将返回一个仅包含[5, 1, 2, 3, 4][5, 1, 3, 2, 4]的集合。

我试图创建一组列表的原因是我以后可以在给定集合中的每个列表上应用转换,并查看在该转换之后该集合是否等同于另一个集合。

3 个答案:

答案 0 :(得分:1)

首先,你不能哈希列表,所以我们将有一组元组,而不是一组列表。

假设您的词典名为d,而0/1 list的名称为mask,则结果很简单:

res = set(tuple(d[i]) for i, v in enumerate(mask) if v)

答案 1 :(得分:0)

您不能拥有一组列表,因为它们不可用。这是因为它们是可变的(可以改变)。一个接近的替代方案是一组元组。您还应该删除输入列表中的重复项。

mapping = {0: [5, 1, 2, 3, 4], 1: [5, 1, 2, 4, 3], 2: [5, 1, 3, 2, 4], 3: [5, 1, 3, 4, 2], 4: [5, 1, 4, 2, 3], 5: [5, 1, 4, 3, 2], 6: [5, 2, 1, 3, 4], 7: [5, 2, 1, 4, 3], 8: [5, 2, 3, 1, 4], 9: [5, 2, 3, 4, 1], 10: [5, 2, 4, 1, 3], 11: [5, 2, 4, 3, 1], 12: [5, 3, 1, 2, 4], 13: [5, 3, 1, 4, 2], 14: [5, 3, 2, 1, 4], 15: [5, 3, 2, 4, 1], 16: [5, 3, 4, 1, 2], 17: [5, 3, 4, 2, 1], 18: [5, 4, 1, 2, 3], 19: [5, 4, 1, 3, 2], 20: [5, 4, 2, 1, 3], 21: [5, 4, 2, 3, 1], 22: [5, 4, 3, 1, 2], 23: [5, 4, 3, 2, 1]}
def get_set(l):
    return {tuple(mapping.get(ind)) for ind, adding in enumerate(l) if adding)}

然后,用你的例子:

>>> a = get_set([1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> a
{(5, 1, 2, 3, 4), (5, 1, 2, 4, 3)}

然后,要对元组进行转换,将它们从集合中移除,转换为列表,然后将它们放回去。一个例子(向每个元素添加7):

new_set = set()
for tup in iter(a):
    new_set.add(tuple(i + 1 for i in tup))
a = new_set

答案 2 :(得分:0)

集合不能包含不可用的类型。具体列表。通常的做法是使用不可变tuple类型:

创建结果集:

>>> result = set()

定义映射:

>>> mapping = {0: [5, 1, 2, 3, 4], 1: [5, 1, 2, 4, 3], 2: [5, 1, 3, 2, 4], 3: [5, 1, 3, 4, 2], 4: [5, 1, 4, 2, 3], 5: [5, 1, 4, 3, 2], 6: [5, 2, 1, 3, 4], 7: [5, 2, 1, 4, 3], 8: [5, 2, 3, 1, 4], 9: [5, 2, 3, 4, 1], 10: [5, 2, 4, 1, 3], 11: [5, 2, 4, 3, 1], 12: [5, 3, 1, 2, 4], 13: [5, 3, 1, 4, 2], 14: [5, 3, 2, 1, 4], 15: [5, 3, 2, 4, 1], 16: [5, 3, 4, 1, 2], 17: [5, 3, 4, 2, 1], 18: [5, 4, 1, 2, 3], 19: [5, 4, 1, 3, 2], 20: [5, 4, 2, 1, 3], 21: [5, 4, 2, 3, 1], 22: [5, 4, 3, 1, 2], 23: [5, 4, 3, 2, 1]}

定义"添加"列表:

>>> test = [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]

现在迭代配对的(index, should_add)项并在需要时添加到结果集中:

>>> for index, add_flag in enumerate(test):
...     if add_flag:
...         result.add(tuple(mapping[index]))
... 

结果:

>>> result
set([(5, 1, 2, 3, 4), (5, 1, 3, 2, 4), (5, 4, 1, 3, 2)])

请注意,我已在1中添加test

如果你需要一个功能:

def mask_dict(mapping, mask):
    result = set()
    for index, should_add in enumerate(mask):
        if should_add:
            result.add(tuple(mapping[index]))
    return result