Из списка данных собрать только 7 желаемых элементов и создать новый список списков, удалив ненужные данные? - PullRequest
0 голосов
/ 20 апреля 2020

Мне нужно перебрать список, проверить, является ли этот элемент integer с < 3 цифрами, если нет, пропустить этот элемент и go к следующему. Делайте это, пока не найдете нужный предмет. Затем возьмите этот предмет и следующие 6, чтобы получить в общей сложности 7 предметов, дающих группы по 7 в новом списке списков. Это позволило бы мне пропустить 'some struff I don't want' и получить только нужные 7 сгруппированных элементов из данных, даже если между ними есть произвольный набор строк.

Я пытался использовать для l oop:

for x in vendor:
    if x in vendor == len(int[0:]) < 3:
        vendor = [vendor[x:x+7] for x in range(0, len(vendor), 7)]
    else:
        pass

Но это только вызывает у меня TypeError: объект 'type' не является подписным. Ошибка имеет смысл, но я не знаю, как это сделать. Вот идея того, что мне нужно, чтобы мой вывод был из входных данных.

Данные:

['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '4', '3.00', '43.00 NC', '1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3','43.00 NC', 'some stuff I dont want', '1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3', '43.00 NC']

Вывод:

[['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '4', '3.00', '43.00 NC'], ['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3', '43.00 NC'], ['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3', '43.00 NC']]

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

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

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

items = []
i = 0
while i < len(data):
    try:
        if int(data[i]) < 100:
            items.append(data[i:i+7])
            i += 7
    except ValueError:
        i += 1
0 голосов
/ 20 апреля 2020

Ошибка 'type' object is not subscriptable относится к этому выражению:

int[0:]

Это бессмысленно, потому что вы не можете взять фрагмент типа int.

Если говорить прямо, вся эта строка выглядит так, как будто она была сгенерирована каким-то случайным процессом:

if x in vendor == len(int[0:]) < 3:

x in vendor всегда будет True, поскольку вы делаете это внутри итерации, где каждое значение x взято из vendor, и я даже не могу догадаться, что len(int[0:]) < 3 предполагается тестировать. Помимо того, что вы пытаетесь нарезать int, ваш срез берет все, что вы нарезаете, и все, что вы делаете, проверяет его len, чтобы вы могли так же легко сделать len(whatever) < 3 , Я не могу понять, что должен делать этот код.

Итак, давайте попробуем построчно пройти описание проблемы, чтобы посмотреть, можно ли ее превратить в код:

Мне нужно перебрать первые 1 элементы в списке

Первый 1 элемент в списке - просто vendor[0]. Это не итерация, потому что вы делаете это только один раз. Вы не говорите, что делаете с этим 1 элементом, поэтому мы можем в основном игнорировать эту строку.

, а затем проверьте, если следующие 7

Так что ' будет vendor[1:8] ...

начинаться с 3 или менее 6 цифр

3 само по себе меньше 6, поэтому мы можем просто сказать «меньше 6 ", правильно? Так что это было бы len(x) < 6 or not x[0:6].isdigit().

, если нет, пропустите каждый элемент, пока он не найдет правильный элемент, возьмите этот и следующие 6, чтобы получить в общей сложности 7 элементов, поместив каждую группу из 7 в новом подсписке.

Я думаю, что это затрудняет выполнение простой итерации for...in, так как мы хотим получить фрагменты списка в зависимости от того, где мы находимся, поэтому итерация по индексам выглядит как путь к go.

Итак, все вместе на основе вашего описания, я думаю, что это:

sublist = []
i = 1  # skip the first element
while i < len(vendor):
    if len(vendor[i]) >= 6 and vendor[i][0:6].isdigit():
        # starts with 6 or more digits, skip this one
        i += 1
        continue
    if len(vendor) - i < 7:
        # don't have 7 items left to grab, so we're done
        break
    # grab the next 7 items and then skip ahead 7
    sublist.append(vendor[i:i+7])
    i += 7

С вашим примером ввода, который меня получает:

[['1', '2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '43.00 NC', '1', '1'], ['2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '43.00 NC', 'some stuff I dont want', '1', '1']]

Это не соответствует вашему примеру вывода, но в вашем описании сказано, что вы хотели, чтобы в вашем подсписке были группы по 7, а ваши примеры выходных групп по 6, поэтому я не знаю, что вам сказать.


А теперь для чего-то совершенно другого

После попытки в комментариях определить, что должен делать этот код, и с полным провалом я собираюсь просто рассмотреть проблему следующим образом:

from typing import List

def some_func(data: List[str]) -> List[List[str]]:
    pass

sample_input = ['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '4', '3.00', '43.00 NC', '1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3','43.00 NC', 'some stuff I dont want', '1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3', '43.00 NC']
sample_output = [['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '4', '3.00', '43.00 NC'], ['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3', '43.00 NC'], ['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3', '43.00 NC']]

assert some_func(sample_input) == sample_output

Класси c т Разработка на основе est - начните с теста, а затем напишите функцию, которая его удовлетворяет.

После небольшого разбора я натолкнулся на алгоритм «удалите все элементы без цифр, сгруппируйте оставшиеся элементы в семерки» :

from typing import List

def some_func(data: List[str]) -> List[List[str]]:
    filtered = [i for i in data if any(c.isdigit() for c in i)]
    return [filtered[i*7:(i+1)*7] for i in range(len(filtered) // 7)]

sample_input = ['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '4', '3.00', '43.00 NC', '1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3','43.00 NC', 'some stuff I dont want', '1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3', '43.00 NC']
sample_output = [['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '4', '3.00', '43.00 NC'], ['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3', '43.00 NC'], ['1','1','2', '11" Some Words symbols and numbers mixed 3-4-2#', '3.00', '3', '43.00 NC']]

assert some_func(sample_input) == sample_output  # passes!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...