Есть ли какой-нибудь «полосовой» метод для списка?

У меня была аналогичная проблема , основанная на комментарии, я использовал следующий синтаксис для решения перед токенизацией:

удалить нулевые значения

clean_text_ddf.where(col("title").isNull()).show()
cleaned_text=clean_text_ddf.na.drop(subset=["title"])
cleaned_text.where(col("title").isNull()).show()
cleaned_text.printSchema()
cleaned_text.show(2)

+-----+
|title|
+-----+
+-----+

+-----+
|title|
+-----+
+-----+

root
 |-- title: string (nullable = true)

+--------------------+
|               title|
+--------------------+
|Mr. Beautiful (Up...|
|House of Ravens (...|
+--------------------+
only showing top 2 rows

5
задан AkshayNevrekar 28 March 2019 в 06:23
поделиться

4 ответа

Используйте itertools.dropwhile с обоих концов:

from itertools import dropwhile

input_data = ["0", "0", "1", "1", "0", "0", "1", "0", "1", "0", "0", "0"]

def predicate(x):
    return x == '0'

result = list(dropwhile(predicate, list(dropwhile(predicate, input_data))[::-1]))[::-1]
result

Выход:

['1', '1', '0', '0', '1', '0', '1']
0
ответ дан gmds 28 March 2019 в 06:23
поделиться

Нет метода списка, но нетрудно реализовать такую ​​функцию: отсканируйте нужные индексы, а затем нарезайте их.

def strip_seq(predicate, xs):
    def scan(xs):
        return next((i for i, x in enumerate(xs) if not predicate(x)), 0)
    return xs[scan(xs) : -scan(reversed(xs)) or None]

xs = ["0", "0", "a", "1", "0", "0", "1", "0", "b", "0", "0", "0"]
print(strip_seq(lambda x: x=='0', xs))  # ['a', '1', '0', '0', '1', '0', 'b']

Это должно работать с любыми типами последовательностей, включая строки и кортежи.

0
ответ дан gilch 28 March 2019 в 06:23
поделиться

Вы можете сделать правую полоску с помощью while / pop.

input = ["0", "0", "1", "1", "0", "0", "1", "0", "1", "0", "0", "0"]
while input and input[-1] == "0": input.pop()

Вы можете левую полосу с itertools.dropwhile, но вам, возможно, придется составить новый список.

from itertools import dropwhile
input = [*dropwhile(lambda x: x=='0', input)]

Или вы можете эффективно использовать / выталкивать с обоих концов, превращая в деку.

from collections import deque
input = ["0", "0", "1", "1", "0", "0", "1", "0", "1", "0", "0", "0"]
input = deque(input)
while input and input[-1] == '0': input.pop()
while input and input[0] == '0': input.popleft()

(Также input() уже является встроенной функцией, поэтому лучше не использовать это имя для переменных.)

0
ответ дан gilch 28 March 2019 в 06:23
поделиться

Нет встроенного метода. Вы можете использовать itertools.dropwhile для удаления влево. Удаление правого угла возможно при использовании функции генератора.

import itertools as it
stripleft = list(it.dropwhile(lambda x: x==myitem, inputlist))
0
ответ дан Torben Klein 28 March 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: