【问题标题】:List comprehension and str.split() returns lists in list instead of individual strings列表理解和 str.split() 返回列表中的列表而不是单个字符串
【发布时间】:2022-01-25 04:25:15
【问题描述】:

假设

thread_sold = ['white', 'white&blue', 'white&blue', 'white', 'white&yellow', 'purple', 'purple&yellow', 'purple&yellow']

我需要该列表中的所有项目,有时用 & 分隔,有时不用。下面的函数有效,但我想知道如何通过列表理解来做到这一点。

def cant_list_comprehend(lst):
    thread_sold_split = []
    for i in lst:
        if "&" in i:
            for x in i.split("&"):
                thread_sold_split.append(x)
        else:
            thread_sold_split.append(i)
    return thread_sold_split

returns ['white', 'white', 'blue', 'white', 'blue', 'white', 'white', 'yellow', 'purple', 'purple', 'yellow', 'purple', 'yellow', 'blue', 'blue', 'purple', 'blue', 'white', 'white'...]

我试过的列表理解:

thread_sold_split_bad = [
    [x for x in y.split("&")] if "&" in y else y for y in thread_sold
]

returns ['white', ['white', 'blue'], ['white', 'blue'], 'white', ['white', 'yellow'], 'purple', ['purple', 'yellow'],...]

如果可以避免的话,我想避免在我的代码中添加命名函数,我也有兴趣使用 lambda 函数来解决这个问题,尽管我目前正在学习基本的东西。

【问题讨论】:

  • “我也有兴趣用 lambda 函数解决这个问题”是吧?为什么?

标签: python list lambda list-comprehension


【解决方案1】:

你可以使用functools.reduce:

from functools import reduce

reduce(lambda x, y: x + y, [x.split("&") for x in thread_sold])

import itertools

list(itertools.chain.from_iterable(x.split("&") for x in thread_sold))

输出

['white', 'white', 'blue', 'white', 'blue', 'white', 'white', 'yellow', 'purple', 'purple', 'yellow', 'purple', 'yellow']

【讨论】:

  • 不要使用 reduce 连接来展平嵌套列表
【解决方案2】:
thread_sold_split_bad = [
    [x for x in y.split("&")] if "&" in y else y for y in thread_sold
]

您上面的尝试不起作用,因为您正在执行嵌套列表推导而不是普通推导(注意主括号内的括号)。这是修正后的版本:

>>> thread_sold_split = [x for y in thread_sold for x in y.split("&")]
>>> print(thread_sold_split)
['white', 'white', 'blue', 'white', 'blue', 'white', 'white', 'yellow', 'purple', 'purple', 'yellow', 'purple', 'yellow']

【讨论】:

  • 谢谢,我对二维数组中的 .strip() 元素使用了嵌套列表理解,它在那里工作,不知道为什么它在这里不起作用,我将不得不对此进行深入研究因为我仍然不是 100% 了解列表理解逻辑。 transactions_cleaned = [ [i.strip() for i in transaction] for transaction in daily_transactions_split ]
  • 乐于助人。如果“它在那里工作”是指它产生了一个列表列表(即二维数组),那么是的,这就是它的作用。如果您需要有关此案例的更多帮助,请在问题中添加一个具体示例,以便我可以帮助您(或者如果您愿意,可以提出一个新问题)。
  • 它已经是一个二维数组,我不得不使用嵌套列表。 strip() 所有元素。基于该逻辑,我认为对问题中的问题使用嵌套列表会起作用,因为它会“在后台运行 append()”或其他东西。为了更好地理解,我将多玩一些列表理解。
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 2013-07-22
  • 1970-01-01
相关资源
最近更新 更多