я получаю больше строк, чем после операции, в 2 разных операциях / половина ответа - PullRequest
0 голосов
/ 04 мая 2020

до этой функции все в порядке, я получаю 4999 строк, это сумма, которую я получил. Можете ли вы проверить код ниже, где я делаю ошибки, в результате которых я получаю 5095 вместо 4999 , а во второй функции у меня 5032 вместо 4999 экземпляров

Я должен получить не более 4999. Любая помощь приветствуется

a=[]
for i in matches:
    a.append([i for i in list(dict.fromkeys(i))])
print(len(a))
print ((a))

результат:

4999
[['23-year-old'], [' '], ['42 years old'], ['-year-old']..]

Может ли -летний быть проблемой здесь?

Теперь я столкнулся с проблемой

t=[]
for i in a:
    for j in i:
        p=len(j)
        if p>1:
            r=j.replace('-', ' ').split(' ')
#             print(r)
            t+=[s for s in r if s.isdigit()]
        else:
            t+=['']
print(len(t))
print(t)

output:

5095 #This should be 4999
['23', '', '42', '', '', '30', '31', ''...]

У меня тоже есть та же проблема со списком пола? В итоге у меня 5032

Эта часть еще не получена

import re

fil = data['transcription']
print(fil)

gender_aux = []
for i in fil:

    try:
        gender = re.findall("female|gentleman|woman|lady|man|male|girl|boy|she|he", i) or [" "]
    except:
        gender_aux.append(' ')
#         pass

    gender_dict = {"male": ["gentleman", "man", "male", "boy",'he'],
               "female": ["lady","female", "woman", "girl",'she']}

    for g in gender:
        if g in gender_dict['male']:
            gender_aux.append('male')
            break
        elif g in gender_dict['female']:
            gender_aux.append('female')
            break
        else:
            gender_aux+=[' ']
            break
print(len(gender_aux))            
print(gender_aux)

Вывод:

5032 #this should be 4999
['female', 'male', 'male', ' ',

1 Ответ

0 голосов
/ 04 мая 2020

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

Если все, что вы после списка, содержащего целые значения всех возрастов, начиная с вашего заполненного списка a, вы можете просто

import re
t = [re.findall(r'\d+', item[0])[0] for item in a if re.findall(r'\d+', item[0])]

. Это понимание списка выполняет несколько вещей.

Во-первых, поскольку ваш список a представляет собой список списков из одного элемента, поскольку при переборе каждого элемента мы получаем значение первого (и единственного) элемента в списке, используя item[0]. Затем мы выполняем операцию регулярного выражения (следовательно, import re) для этого элемента с шаблоном поиска r'\d+', который извлекает только целочисленные значения из каждой строки (Вы можете проверить https://regex101.com/, чтобы поиграться с шаблоны регулярных выражений, чтобы лучше понять, как они работают).

Поскольку re.findall возвращает список совпадений, и, поскольку кажется, что каждая строка в вашем наборе данных будет содержать только одно совпадение (самое большее), мы просто берем [ 0] индекс полученного списка как выбранное нами значение. Если совпадений нет, re.findall возвращает пустой список. Поскольку пустые списки имеют значение false, оператор if в нашем понимании списка предотвратит ошибки индексации строк, в которых нет извлекаемых чисел.

Используя ваш пример, результирующий массив t будет иметь вид следует:

['23', '42']

Обратите внимание, что пустые строки не включены в окончательный список. Если вы хотите включить их, вы можете просто добавить условие else в наш оператор if следующим образом:

t = [re.findall(r'\d+', item[0])[0] if re.findall(r'\d+', item[0]) else '' for item in a]

это приведет к

['23', '', '42', '', '']

Наконец, если вы хотите преобразовать каждое число (в настоящее время строки) в целочисленные значения, вы могли бы вместо этого написать:

t = [int(re.findall(r'\d+', item[0])[0]) if re.findall(r'\d+', item[0]) else '' for item in a]

, что в конечном итоге приведет к:

[23, '', 42, '', '']

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

Например, наш re.findall со строкой «Мне 42 года, и мой son is 16 ", вернул бы ['42', '16'], и поскольку мы возвращаем только первый элемент списка, окончательный список не будет содержать '16'. Помните об этом.

Поскольку мы не создаем никаких дополнительных элементов (например, с помощью str.split()), мы можем быть уверены, что результирующий список состоит из того же числа элементов (при условии, что мы используем вариант с оператором else ''). Если мы используем первый вариант, результирующий список будет содержать только столько элементов, сколько есть элементов в a, содержащих числа.

...