Определите одну разницу в списке Python - PullRequest
0 голосов
/ 17 января 2019

Мне нужно получить помощь по части моего кода. У меня есть список Python, пример:

list1 = (1,1,1,1,1,1,5,1,1,1)
list2 = (6,7,4,4,4,1,6,7,6)
list3 = (8,8,8,8,9)

Я хотел бы, чтобы для каждого списка было известно, есть ли одно значение, которое отличается от других значений, если и только если все эти другие значения одинаковы. Например, в списке list1 он будет обозначать «5» как другое значение, в списке list2 он не будет ничего определять, поскольку имеется более двух различных значений, а в списке list3 он будет обозначать «9»

Что я уже сделал:

 for i in list1:
     if list1(i)==len(list1)-1
     print("One value identified")

Проблема в том, что я получаю "Одно значение идентифицировано" столько раз, сколько "1" присутствует в моем списке ...

Но я бы хотел получить такой вывод:

  • Наиболее представленное значение равно len (list1) -1 (Здесь "1")
  • Значение, которое присутствует только один раз (здесь «5»)
  • Позиция в списке, где "5"

Ответы [ 4 ]

0 голосов
/ 17 января 2019

Вы можете сначала проверить наиболее распространенное значение. После этого просмотрите список, чтобы увидеть, есть ли другое значение, и отследите его. Если позже вы найдете другое значение, которое отличается от самого распространенного, в списке не будет разницы.

list1 = [1,1,1,1,1,1,5,1,1,1]

def single_difference(lst):
    most_common = max(set(lst), key=lst.count)
    diff_idx = None
    diff_val = None
    for idx, i in enumerate(lst):
        if i != most_common:
            if diff_val is not None:
                return "No unique single difference"
            diff_idx = idx
            diff_val = i
    return (most_common, diff_val, diff_idx)

print(single_difference(list1))
0 голосов
/ 17 января 2019

Вы можете использовать что-то вроде этого:

def odd_one_out(lst):
    s = set(lst)
    if len(s)!=2:  # see comment (1)
        return False
    else:
        return any(lst.count(x)==1 for x in s)  # see comment (2)

, который для приведенных вами примеров дает:

print(odd_one_out(list1))  # True
print(odd_one_out(list2))  # False
print(odd_one_out(list3))  # True

Чтобы объяснить код, я бы использовал первый примерпредоставленный вами список [1,1,1,1,1,1,5,1,1,1].

(1) преобразование в set удаляет все дублирующиеся значения из вашего списка, оставляя вам {1, 5} (в произвольном порядке).Если длина этого набора отличается от 2, ваш список не соответствует вашим требованиям, поэтому возвращается False

(2) Если предположить, что set имеет длину 2, чтонам нужно проверить следующее: хотя бы одно из содержащихся в нем значений появляется только один раз в исходном list.Вот что делает any.

0 голосов
/ 17 января 2019

Вы можете использовать встроенные Counter из Высокопроизводительные типы данных контейнеров :

from collections import Counter
def is_single_diff(iterable):
    c = Counter(iterable)
    non_single_items = list(filter(lambda x: c[x] > 1, c))
    return len(non_single_items) == 1

Тесты

list1 = (1,1,1,1,1,1,5,1,1,1)
list2 = (6,7,4,4,4,1,6,7,6)
list3 = (8,8,8,8,9)

In: is_single_diff (list1)

Out: True

In: is_single_diff (list2)

Out: False

In: is_single_diff (list3)

Out: True

0 голосов
/ 17 января 2019

Используйте уникальный numpy, он предоставит вам всю необходимую информацию.

myarray = np.array([1,1,1,1,1,1,5,1,1,1])
vals_unique,vals_counts = np.unique(myarray,return_counts=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...