如何将嵌套列表中的值转换为集合?

时间:2018-01-02 17:58:31

标签: python set nested-lists

我想知道是否有人对如何转换嵌套列表中包含的值有任何想法,所以你最终会得到一个列表列表? 我有:

[[0, 1, 2, 3, 4, 0, 6, 7, 8], [1, 4, 5, ...], ...]

我正在尝试将其转换为0{0}1{1}。即:

[[{0}, {1}, {2}, {3}, {4}, {0}, {6}, {7}, {8}], [{1}, {4}, {5}, ...], ...]

我目前有:

def ToSets(list):
    for i in range(0,9): #row
        for j in list[i]:
            list[i][j] = set(list[i][j])
   print(list)

我一直收到这个错误:

TypeError: 'int' object is not iterable

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

set()获取可迭代中的值,并分别添加每个值。你传递了一个int,它根本不可迭代。

您必须将各个值包装在可迭代中,如列表:

list[i][j] = set([list[i][j]])

更容易的选择是使用{...}集合文字表示法:

list[i][j] = {list[i][j]}

如果列表不需要更新 ,您还可以使用nested list comprehension创建新的列表列表结构:

def to_sets(l):
    return [[{i} for i in row] for row in l]

如果必须就地更新,至少只迭代外部行,并使用enumerate()生成内部列的索引:

def to_sets_inplace(l):
    for row in l:
        for i, value in enumerate(row):
            row[i] = {value}

如果您对原始列表列表有其他引用,请坚持直接设置值,否则请使用列表推导。两者都有效:

>>> def to_sets(l):
...     return [[{i} for i in row] for row in l]
...
>>> demo = [[0, 1, 2, 3, 4, 0, 6, 7, 8], [1, 4, 5]]
>>> def to_sets_inplace(l):
...     for row in l:
...         for i, value in enumerate(row):
...             row[i] = {value}
...
>>> to_sets(demo)
[[{0}, {1}, {2}, {3}, {4}, {0}, {6}, {7}, {8}], [{1}, {4}, {5}]]
>>> to_sets_inplace(demo)
>>> demo
[[{0}, {1}, {2}, {3}, {4}, {0}, {6}, {7}, {8}], [{1}, {4}, {5}]]

答案 1 :(得分:3)

您可以传递{}中的每个元素来创建一个集合,否则您必须传递set()一个可迭代的序列,而不是一个整数。

>>> data = [[1,2,3],[4,5,6]]
>>> [[{j} for j in i] for i in data]
[[{1}, {2}, {3}], [{4}, {5}, {6}]]