Я хотел бы поместить последовательность одного и того же числа в список, чтобы окончательно вычислить длину каждой последовательности.

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']

Благодарность

0
chaft 4 Фев 2022 в 14:22
Проверьте itertools.groupby; например [list(g) for _, g in itertools.groupby(h)].
 – 
hilberts_drinking_problem
4 Фев 2022 в 14:24

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']]
2
Sembei Norimaki 4 Фев 2022 в 14:41

Вы можете использовать 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
1
Matthias 4 Фев 2022 в 14:56

Вы можете отслеживать предыдущий элемент p, добавленный в список l. Изначально p устанавливается равным 0. Если вы встретите «0» в списке h во время обхода, вы напрямую добавите «0» к списку l. и снова сделайте p=0.

Но если вы встретите «1» в списке h при добавлении его к l, тогда посмотрите, был ли предыдущий элемент p, добавленный в список, равным 0 или нет, поэтому у вас есть 2 случаи:

  1. if p==0: тогда вам нужно создать новый элемент списка с "1", т.е. [1].

    l.append([i])

  2. 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
1
Khushi Bhambri 4 Фев 2022 в 15:05