Как найти индекс неповторяющегося списка в списке списка без использования count? - PullRequest
0 голосов
/ 25 мая 2020

Предположим, у меня есть список таких списков
[['a'], ['a'], ['a'], ['b'], ['a'], ['a'], ['a']]
Теперь я sh, чтобы найти индекс элемента списка, который отличается от остальных, в данном случае это [b] в index 3. Я пробовал использовать

for i in list: 
    if list.count(i) == 1 :
        return list.index(i)

для получения индекса, но когда размер списка увеличивается, временная сложность становится экспоненциально большой, поскольку функция count находит вхождения каждого элемента каждый раз, когда l oop работает. Мне было интересно, есть ли простой и быстрый способ получить индекс неповторяющегося списка. Примечание. Я также попытался создать словарь с ключом в качестве списка и значением в качестве его количества вхождений, но при таком подходе я не смог сохранить индекс списка, который мне нужен в моем коде.

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Может быть, попробуйте следующее:

for i in range(1,len(list)):
    if (list[1] == list[2]) and (list[0] != list[1]):
        return 0
    if list[0] != list[i]:
        return i

Это работает, только если у вас есть только один элемент в списке, который является лишним.

Извините за уродливый первый оператор if.

0 голосов
/ 25 мая 2020

В случае, если это полезно, вот версия, которая начнется с создания списка уникальных значений и индексов, в которых они встречаются, перед проверкой того, действительно ли список состоит из ряда общих значений и single «odd one out», и если да, то укажите индекс нечетного.

Я не смог найти лаконичного способа сделать это. Не помогло то, что элементы списка не являются хэшируемыми объектами, поэтому было невозможно использовать наборы.

list = [['a'], ['a'], ['a'], ['b'], ['a'], ['a'], ['a']]

# build up a list of 2-tuples of each containing
# (unique value, list indices where this value occurs)

unique_values_and_indices = []
for index, element in enumerate(list):
    for value_and_indices in unique_values_and_indices:
        if element == value_and_indices[0]:
            value_and_indices[1].append(index)
            break
    else:
        unique_values_and_indices.append((element, [index]))

# sort these 2-tuples in order of increasing number of indices
unique_values_and_indices.sort(
    key=lambda value_and_indices: len(value_and_indices[1]))

# check that we have two unique values, one of which occurs at exactly
# one index, and the other of which occurs at more than one index

if (len(unique_values_and_indices) == 2
    and len(unique_values_and_indices[0][1]) == 1
    and len(unique_values_and_indices[1][1]) > 1):

    print("the odd one out occurs at index {}"
          .format(unique_values_and_indices[0][1][0]))

    # # uncomment the following statement for some additional info
    # # beyond what was strictly asked in the question
    #
    # print("the common value is {}, and the odd one out is {}"
    #       .format(unique_values_and_indices[1][0],
    #               unique_values_and_indices[0][0]))

else:
    print("the assumptions were not valid")
...