Я хотел бы поместить последовательность одного и того же числа в список, чтобы окончательно вычислить длину каждой последовательности.
l= []
h = ['1', '1', '0', '1', '1', '1']
for i in h:
if i == "1":
l.append([i])
elif i == "0":
l.append(i)
Выход :
[['1'], ['1'], '0', ['1'], ['1'], ['1']
Вывод, который я хотел бы:
[['1', '1'], '0', ['1', '1', '1']
Благодарность
3 ответа
Если вы найдете 1, может быть два варианта:
- предыдущий элемент был 0, поэтому вам нужно добавить новый список, содержащий 1.
- предыдущий элемент был 1, поэтому вам нужно расширить существующий список, добавив 1
Конечно, вы можете проверить предыдущий элемент, только если индекс i
больше 0.
l= []
h = ['1', '1', '0', '1', '1', '1']
for i, elem in enumerate(h):
if elem == "0":
l.append("0")
elif elem == "1" and i > 0 and l[-1] != "0":
l[-1].extend("1")
else:
l.append(["1"])
print(l)
[['1', '1'], '0', ['1', '1', '1']]
Вы можете использовать groupby
.
Код преобразует содержимое группы в список. Если этот список содержит более одной записи, этот список будет добавлен к результирующему списку. Если есть только одна запись, добавляется только эта запись.
import itertools
h = ['1', '1', '0', '1', '1', '1', '0', '0', '1']
l = [elements[0] if len(elements) == 1 else elements for elements in (list(group) for _, group in itertools.groupby(h))]
print(l)
Результатом является [['1', '1'], '0', ['1', '1', '1'], ['0', '0'], '1']
.
Это будет работать с любыми значениями в списке. Итак, если вы определите h = ['1', '1', 'X', 'X', 'Y', 'Z', 'A', 'A', 'A']
, вы получите [['1', '1'], ['X', 'X'], 'Y', 'Z', ['A', 'A', 'A']]
.
Поскольку вы заявили, что хотите рассчитать длину каждой последовательности, вам даже не нужно создавать промежуточный список.
h = ['1', '1', '0', '1', '1', '1']
for element, group in itertools.groupby(h):
print(f'{len(list(group))} * {element}')
На выходе
2 * 1
1 * 0
3 * 1
Вы можете отслеживать предыдущий элемент p
, добавленный в список l. Изначально p устанавливается равным 0. Если вы встретите «0» в списке h
во время обхода, вы напрямую добавите «0» к списку l
. и снова сделайте p=0
.
Но если вы встретите «1» в списке h
при добавлении его к l
, тогда посмотрите, был ли предыдущий элемент p
, добавленный в список, равным 0 или нет, поэтому у вас есть 2 случаи:
if
p==0
: тогда вам нужно создать новый элемент списка с "1", т.е. [1].l.append([i])
if
p!=0
: тогда вам нужно добавить "1" к последнему добавленному спискуl[-1].append(i)
Вот необходимый код с желаемым результатом:
l= []
h = ['1', '1', '0', '1', '1', '1']
p=0
for i in h:
if i == "1":
if(p==0):
l.append([i])
p=1
else:
l[-1].append(i)
elif i == "0":
l.append(i)
p=0
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.
itertools.groupby
; например[list(g) for _, g in itertools.groupby(h)]
.