Python: учитывая список целых чисел x, напишите одно выражение, которое возвращает True, если все нечетные значения индекса вдвое превышают их предыдущие значения

Имея список целых чисел, скажем, x = [5, 10, 6, 12, 10, 20, 11, 22], напишите одно выражение, которое возвращает True, если все нечетные значения индекса в два раза больше предыдущих значений. Нам нужно использовать пропуск фрагментов, zip, все и понимание списка

Я новичок в программировании на Python (хотя у меня большой опыт работы с Java). Это всего лишь основной вопрос о синтаксисе Python, но я не могу этого сделать. Я пробовал следующее:

list(zip(x[::2], x[1::2]))

это выражение возвращает мне список, как показано ниже [(5, 10), (6, 12), (10, 20), (11, 22)]

После этого я потерял, как проверить состояние пар. Ищете что-то вроде

print(all([False for pair in list(zip(x[::2],x[1::2]))]) "write something in proper format that checks pair values for double condition")


person inferno    schedule 23.09.2020    source источник
comment
Нам нужно использовать ... - это для учебных целей, я полагаю?   -  person Jan Stránský    schedule 23.09.2020
comment
comment
Да, это для обучения. Я знаю, что это очень тривиальный вопрос, который можно задать на этом форуме, но, исходя из Java, Python имеет гораздо больше этих хитрых синтаксисов, и я не смог его взломать. Спасибо за помощь!   -  person inferno    schedule 23.09.2020


Ответы (3)


Использование Zip, срезов и понимания списка

x = [5, 10, 6, 12, 10, 20, 11, 22]
all([b == 2*a for a, b in zip(x[::2], x[1::2])])  # True

Пояснение

Генератор пар чисел

zip(x[::2], x[1::2]) # produces [(5, 10), (6, 12), (10, 20), (11, 22)]

Перебрать кортежи (устанавливая a, b по мере продвижения)

for a, b in zip(x[::2], x[1::2]) 

Проверить состояние

b == 2*a   # second number is twice 1st

Проверьте, верно ли везде

all(...)
person DarrylG    schedule 23.09.2020
comment
Спасибо DarryIG за подробное объяснение! - person inferno; 23.09.2020

Этот?

x = [5, 10, 6, 12, 10, 20, 11, 22]
result = all(x2 == 2*x1 for x1,x2 in zip(x[::2],x[1::2]))
print(result) # True
person Jan Stránský    schedule 23.09.2020
comment
Ваше решение в точку. Спасибо! Однако ваше решение повторяет кортеж, скажем, я использую этот list(zip(x[::2], x[1::2])), поэтому это даст мне список, подобный [(5, 10), (6, 12), (10, 20), (11, 22)]. Как мне сделать то же самое в списке (в котором есть эти пары)? Как именно это называется в Python? Список Список ?? - person inferno; 23.09.2020
comment
@inferno '[(5, 10), (6, 12), (10, 20), (11, 22)]' зовут str. [(5, 10), (6, 12), (10, 20), (11, 22)] называется list (из tuples (из (пары) ints)), в зависимости от того, насколько точным вы хотите быть - person Jan Stránský; 23.09.2020

Как насчет этого:

In [123]: x
Out[123]: [5, 10, 6, 12, 10, 20, 11, 22]

In [124]: all([x[i]/x[i-1]==2 for i in range(1, len(x) - 1, 2)])
Out[124]: True
person idar    schedule 23.09.2020
comment
Мне нужно использовать пропуск нарезки, zip, все и понимание списка. Ваше решение не содержит методов zip и list. Можете ли вы предоставить решение, используя их. - person inferno; 23.09.2020
comment
Да! это выглядит более точным. Спасибо всем участникам сообщества за помощь :) - person inferno; 23.09.2020
comment
Это точнее: all([y/x==2 for x,y in zip(x[::2],x[1::2])]) - person idar; 23.09.2020