Проверка, совпадают ли первые цифры в каждом элементе списка - PullRequest
0 голосов
/ 29 октября 2018

Как мне проверить, совпадают ли первые цифры в каждом элементе списка?

for i in range(0,len(lst)-1):
     if lst[i] == lst[i+1]:
          return True

Я знаю, что это проверяет, равно ли число до того, как следующее число в списке, но я просто хочу сосредоточиться на первой цифре.

Ответы [ 4 ]

0 голосов
/ 29 октября 2018

Для логического предиката в списке, подобном этому, вам нужно решение, которое возвращает False, как только обнаружен конфликт - решения, которые преобразуют список весь просто для поиска первого и второго.элемент не соответствует, не хорошие алгоритмы.Вот один из подходов:

def all_same_first(a):
    return not a or all(map(lambda b, c=str(a[0])[0]: str(b)[0] == c, a[1:]))

Хотя на первый взгляд может показаться, что это нарушает то, что я сказал выше, функция map является ленивой и поэтому только вручает функции all то, что ей нужно, так, как это необходимо., поэтому, как только какой-то элемент не соответствует первому (начально-цифровому), возвращается логический результат, а остальная часть списка не обрабатывается.

Возвращаясь к исходному коду:

это проверяет, равен ли предыдущий номер следующему в списке

for i in range(0,len(lst)-1):
     if lst[i] == lst[i+1]:
          return True

Как вы утверждаете, это не работает.Для правильной работы потребуется:

for i in range(0, len(lst) - 1):
     if lst[i] != lst[i + 1]:
          return False

return True

Видите ли вы разницу?

0 голосов
/ 29 октября 2018

Используйте all() в качестве генератора первых символов вашего числа:

>>> l = [1, 10, 123]
>>> all(str(x)[0] == str(l[0])[0] for x in l)
True

Понимание списка

>>> [str(x)[0] for x in l]

создает список

['1', '1', '1']

звучит так, как будто этого должно быть достаточно. Но all обрабатывает логические значения, а логическое значение строки всегда True, за исключением случаев, когда строка пуста. Это означает, что ['1','2','3'] также будет считаться True. Вам нужно добавить сравнение с постоянным значением - я выбрал первый элемент из исходного списка:

>>> [str(x)[0] == str(l[0])[0] for x in l]
[True, True, True]

тогда как в списке, таком как [1,20,333], будет отображаться

['1', '2', '3']

и

[True, False, False]

Вы также можете настроить его на большее количество цифр:

>>> all(str(x)[:2] == str(l[0])[:2] for x in l)
False
>>> l = [12,123,1234]
>>> all(str(x)[:2] == str(l[0])[:2] for x in l)
True
0 голосов
/ 29 октября 2018

Вы можете использовать math.log10 и деление по полу для вычисления первой цифры.Затем используйте all с выражением генератора и zip для последовательного тестирования смежных элементов:

from math import log10

def get_first(x):
    return x // 10**int(log10(x))

L = [12341, 1765, 1342534, 176845, 1]

res = all(get_first(i) == get_first(j) for i, j in zip(L, L[1:]))  # True

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

def check_first(L):
    for i, j in zip(L, L[1:]):
        if get_first(i) != get_first(j):
            return False
    return True

res = check_first(L)  # True
0 голосов
/ 29 октября 2018

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

lst = [12, 13, 14]


def all_equals(l):
    return len(set(e[0] for e in  map(str, l))) == 1

print all_equals(lst)

выход

True

Объяснение

Функция map(str, l) преобразует все элементы в списке в строку, а затем с помощью (e[0] for e in map(str, l)) получает первую цифру всех элементов, используя выражение генератора. Наконец, введите генератор в функцию set, это удалит все дубликаты, наконец, вы должны проверить, равна ли длина набора 1, что означает, что все элементы были дубликатами.

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