首页 > 解决方案 > 在 2 次不同的操作中,我得到的行数比操作后的行数多/已回答一半

问题描述

直到这个函数一切都很好,我得到了 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)

输出:

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

标签: pythonlistfor-loopdata-cleaning

解决方案


假设您的数据集中没有十进制值,并且每个列表项将仅包含一个字符串,每个字符串一个数字。

如果您想要一个包含每个人年龄整数值的列表,从您完成的列表开始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返回一个空列表。因为空列表评估为假,if我们的列表推导式中的语句将防止在没有要提取的数字的字符串上出现索引错误。

使用您的示例,生成的t数组将如下所示:

['23', '42']

请注意,空字符串不包含在最终列表中。如果你想包含它们,你可以简单地在我们的 if 语句中添加一个 else 条件,如下所示:

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 岁,我儿子 16 岁”,将返回 ['42', '16'],因为我们只返回列表的第一项,所以最终列表不会包括“16”。请记住这一点。

因为我们没有创建任何额外的项目(例如通过使用str.split()),所以我们可以确保结果列表包含相同数量的元素(只要我们在else ''语句中使用变体)。a如果我们使用第一个变体,结果列表将只包含与包含数字的元素一样多的元素。


推荐阅读