Python Count уникальные элементы для многомерного списка - PullRequest
0 голосов
/ 19 сентября 2019

Я написал функцию для подсчета уникальных элементов в двумерном списке в Python, и мне интересно, как сделать его более общим для списков любого числа измерений.Ответы, которые я видел до сих пор о поиске измерения путем тестирования, является ли первый экземпляр списком, не кажутся надежными.Пожалуйста, обратите внимание, я хочу избежать использования 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)

Ответы [ 3 ]

2 голосов
/ 19 сентября 2019

Вы можете избежать использования дополнительного пространства, запустив два цикла 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 голос
/ 19 сентября 2019

Вот мой быстрый взлом.Это немного нечисто с исключением, но оно короткое и относительно эффективное.

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
1 голос
/ 19 сентября 2019

Это вернет уникальные элементы, которые можно затем назвать 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

Что происходит?
Это рекурсивная проблема.Если уровень не является списком, то предположим, что это элемент, и добавьте его в набор видимых элементов.если это список, то снова запустите для него функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...