我已经编写了一个函数来计算Python中2d列表中的唯一元素,并且我想知道如何使它对任意数量的维列表更通用。到目前为止,我所看到的关于通过测试第一个实例是否为列表来找到尺寸的答案似乎并不可靠。请注意,我要避免使用NumPy。
有什么建议吗?
def count_unique_elements_2d_list(list_2d):
flat_list = []
for sublist in list_2d:
for item in sublist:
flat_list.append(item)
unique_recipes = set(flat_list)
return len(unique_recipes)
答案 0 :(得分:2)
通过运行两个for循环并将唯一元素添加到集合中,可以避免使用多余的空间。
def count_unique_elements_2d_list(list_2d):
unique=set()
for sublist in list_2d:
for item in sublist:
unique.add(item)
return len(unique)
如果元素已经存在,则不会将其添加到集合中。您将获得元素的唯一计数。
答案 1 :(得分:1)
这将返回唯一的元素,然后您可以在其上调用len
。
def get_unique(some_array, seen=None):
if seen is None:
seen = set()
for i in some_array:
if isinstance(i, list):
seen.union(get_unique(i, seen))
else:
seen.add(i)
return seen
发生了什么事?
这是一个递归问题。如果级别不是列表,则假定它是一个项目,并将其添加到可见项目集。如果它是列表,则在其上再次运行该函数。
答案 2 :(得分:1)
这是我的快速技巧。除了,这有点不干净,但它简短且相对有效。
def get_dimensions(lut):
dim = 0
test = lut
try:
while test[0]:
dim = dim + 1
test = test[0]
except TypeError:
return dim
def to_onedimensional(lut, dim, output, counter):
if(counter == dim - 1):
for x in lut:
output.append(x)
else:
for x in lut:
to_onedimensional(x, dim, output, counter + 1)
这是使用方法:
lut = [[[3],[4]], [[2],[3]]]
print(get_dimensions(lut))
output = []
to_onedimensional(lut, get_dimensions(lut), output, 0)
res = set(output)
print(len(res))
输出:
3
3