我想知道是否有人对如何转换嵌套列表中包含的值有任何想法,所以你最终会得到一个列表列表? 我有:
[[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
有谁知道如何解决这个问题?
答案 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}]]