Как отфильтровать / очистить список в Python - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть список, в котором есть текст и цифры, а также пустые значения.Я собираюсь взять:

products = [[], [], [], [], [], [], [], [], [], [], ['productid="6836518"', 'productid="5965878"', 'productid="3851171"'], ['productid="6455623"'], [], ['productid="8024914"', 'productid="2871360"', 'productid="6694729"', 'productid="6760262"'], [], [], ['productid="6466698"', 'productid="5340641"', 'productid="6071996"', 'productid="5379225"'], ['productid="6683916"', 'productid="6690577"', 'productid="7117851"'], ['productid="7094467"'], ['productid="6628351"'], ['productid="5897930"'], ['productid="6812437"', 'productid="5379225"'], ['productid="7918467"', 'productid="7918466"'], []]

и вернуть что-то вроде:

products2 =  [6836518, 5965878, 3851171, 6455623, 8024914, 2871360, 6694729, 6760262, 6466698, 5340641, 6071996, 5379225, 6683916, 6690577, 7117851, 7094467, 6628351, 5897930, 6812437, 5379225, 7918467, 7918466] 

Ответы [ 4 ]

0 голосов
/ 15 февраля 2019

Вы можете попробовать это:

С пониманием списка:

tmp = [ j for i in products for j in i]
result = [ int(i.split('=')[1].replace('"','')) for i in tmp]

print(result) # will give the desired output

Расширение понимания списка:

result= []

for i in products:
  if i:
    for j in i:
      tmp = j.split('=')
      result.append(int(tmp[1].replace('"','')))

print(result)
0 голосов
/ 15 февраля 2019
import re

data = [[], [], [], [], [], [], [], [], [], [], ['productid="6836518"', 'productid="5965878"', 'productid="3851171"'], ['productid="6455623"'], [], ['productid="8024914"', 'productid="2871360"', 'productid="6694729"', 'productid="6760262"'], [], [], ['productid="6466698"', 'productid="5340641"', 'productid="6071996"', 'productid="5379225"'], ['productid="6683916"', 'productid="6690577"', 'productid="7117851"'], ['productid="7094467"'], ['productid="6628351"'], ['productid="5897930"'], ['productid="6812437"', 'productid="5379225"'], ['productid="7918467"', 'productid="7918466"'], []]
clean = []

for l in data:
    for item in l:
        clean.append(int(re.search('\d+', item).group(0)))

print(clean)
0 голосов
/ 15 февраля 2019

Это однолинейное решение должно работать с использованием re:

import re
product = [int(re.search("\d+",e).group()) for l in products for e in l]

результат product:

[6836518,
 5965878,
 3851171,
 6455623,
 8024914,
 2871360,
 6694729,
 6760262,
 6466698,
 5340641,
 6071996,
 5379225,
 6683916,
 6690577,
 7117851,
 7094467,
 6628351,
 5897930,
 6812437,
 5379225,
 7918467,
 7918466]
0 голосов
/ 15 февраля 2019

Итак, изучите вашу структуру данных.У вас есть список списков, где эти внутренние списки содержат ноль или элементы, которые выглядят как 'productid="0123456"', и вы хотите получить эти цифры.

Вы должны иметь возможность использовать itertools.chain для этого:

products2 = []

for el in itertools.chain.from_iterable(products):
    if 'productid' in el:
        _, num = el.split('=')
        num = int(num.strip('"'))
        products2.append(num)

Если у вас может быть productid='12345', а также ..."12345", вы можете удалить оба типа кавычек вместо num = int(num.strip('"\'')) (обратите внимание на экранированную одинарную кавычку, которая, я думаю, выглядит чище, чем эквивалент """"'""")

...