【问题标题】:Flatten a list and a string [duplicate]展平列表和字符串[重复]
【发布时间】:2015-12-07 21:37:45
【问题描述】:

我知道如何轻松扁平化列表列表。 例如:

my_list = [['abc'],[1,2,3]]
list(itertools.chain.from_iterable(my_list))

但是如果

my_list = ['abs',[1,2,3]]
list(itertools.chain.from_iterable(my_list))

我得到['a','b','c',1,2,3],而我想要['abc', 1,2,3]

我可以通过为原始列表中的第二个元素运行for loop 来解决这个问题,但这似乎是一种混乱的方式,如果你不知道列表中的哪个元素是一个列表,它是一个字符串。

有没有一种简单的方法来展平同时包含列表和字符串的列表?

【问题讨论】:

  • 使用this 回答但检查字符串类型。我会说如何做到这一点,但无论你使用的是 Python 2 还是 Python 3,它都是不同的,你还没有说。
  • 好的,然后:[item for sublist in my_list for item in sublist if not isinstance(sublist, basestring)]

标签: python


【解决方案1】:

您可以将reducelambda 函数一起使用

l = lambda x,y: (x if isinstance(x,list) else [x]) + (y if isinstance(y,list) else [y])
reduce(l, my_list)

示例

>>> my_list = [['abc'],[1,2,3]]
>>> reduce(l, my_list)
['abc', 1, 2, 3]

>>> my_list = ['abs',[1,2,3]]
>>> reduce(l, my_list)
['abs', 1, 2, 3]

这样,您实际上减少一个单独的事物列表到这些事物的一个列表。

它适用于您想要的列表中的任意数量的列表。 例如:

>>> my_list = ['abs',[1,2,[3,4]]]
>>> tmp = reduce(l, my_list)
#tmp = ['abs', 1, 2, [3,4]] - Just run again
>>> reduce(l, tmp)
>>> ['abs', 1, 2, 3, 4]

值得注意的是,这不是一种有效的方法,正如两位炼金术士所强调的那样

【讨论】:

  • 请注意,reduce + lambda 在 Python 中效率很低,一些 IDE 和 linter(例如 pylint)会抱怨它。
猜你喜欢
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2011-02-24
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
相关资源
最近更新 更多