在python中的单行循环内添加多个条件

时间:2019-01-06 18:13:38

标签: python list loops itertools

我正在使用beautifulsoup抓取网站,并获得类p的所有text元素。有时在此p中,存在一个我要保存的类为emoji的元素。所以我最初做了这个循环:

for p in soup.find_all('p', {'class': 'text'}):
    emoji = p.select('emoji')
    ems = ""
    if emoji:
        for em in emoji:
            ems += (str(em['alt']))
    result.append([p.getText(), ems])

我将其转换为单行循环:

result = [[x.getText(), y['alt']] for x in soup.find_all("p", {"class": "text"}) for y in x.select('emoji')]

单行循环的问题是:

  • 它将p保存在存在的类emoji中,仅 。我需要保存所有p,并且当emoji不存在时,我想保存一个空字符串,例如 ['lorem ipsun',''] 。我应该在单行循环中的何处添加此条件?

  • 如果存在多个emoji,则每次保存相同的text n 次, n 是每次表情符号的数量使用不同的表情符号。我该如何保存用逗号分隔的所有表情符号?尝试做''.join(','+y['alt'])而不是y['alt'],但没有改变我的结果。

谢谢。

3 个答案:

答案 0 :(得分:0)

尝试一下:

import functools

result = [ [p.getText(), functools.reduce(lambda x, y: x + y, [ str(em['alt']) for em in p.select('emoji')])] for p in soup.find_all('p', {'class': 'text'})]

答案 1 :(得分:0)

使用@AniketNavlur的答案并对其进行了一些修改,最终成功了:

result = [[p.getText(), functools.reduce(lambda x, y: x + y, [str(em['alt']) for em in p.select('emoji')], '') ] for p in soup.find_all('p', {'class': 'text'})]

答案 2 :(得分:0)

单行写for循环的方式,多用于Data Science Project,你可以用这种方式,因为我们有6个标记的假新闻LIAR:

Labels:  ['barely-true' 'false' 'half-true' 'mostly-true' 'pants-fire' 'true']

将其表示为二进制标签:

我们使用以下方式:

labels = [ 1 if lab=='false' or lab=='pants-fire' or lab=='barely_true'  else 0 for lab in df.is_fake]

希望能帮助到很多想用同样方法解决问题的人。