Python 将列表列表分解为具有不可编辑列表元素的单个列表
参考: 虽然上面提到的解决方案是有帮助的,但我的问题略有不同,我想知道是否有一种类似python的方法来解决它Python 将列表列表分解为具有不可编辑列表元素的单个列表,python,Python,参考: 虽然上面提到的解决方案是有帮助的,但我的问题略有不同,我想知道是否有一种类似python的方法来解决它 a = [['a-3','b-3'],'r',['j']] 我想要的是一种使“a”等于以下值的干净方法: a = ['a-3','b-3','r','j'] 我一直在使用Python2.4,因此与2.4兼容的pythonic解决方案将非常好,但我仍然会发现2.7+示例也很有趣 主要的问题是存在不可iterable元素,否则sum(lst,[])工作得很好,2.7+的chain方法
a = [['a-3','b-3'],'r',['j']]
我想要的是一种使“a”等于以下值的干净方法:
a = ['a-3','b-3','r','j']
我一直在使用Python2.4,因此与2.4兼容的pythonic解决方案将非常好,但我仍然会发现2.7+示例也很有趣
主要的问题是存在不可iterable元素,否则sum(lst,[])工作得很好,2.7+的chain方法也是如此。那么:
itertools.chain.from_iterable(map(lambda i: i if type(i) == list else [i], a))
或者,为了可读性:
def assure_is_list(a):
return a if type(a) == list else [a]
itertools.chain.from_iterable(map(assure_is_list, a))
那么:
itertools.chain.from_iterable(map(lambda i: i if type(i) == list else [i], a))
或者,为了可读性:
def assure_is_list(a):
return a if type(a) == list else [a]
itertools.chain.from_iterable(map(assure_is_list, a))
希望这有帮助
希望这有帮助,Pythonic解决方案可以有很多意义。考虑到(PEP 20),这是我对该线程的贡献:
def dec(input_, output_):
if type(input_) is list:
for subitem in input_:
dec(subitem, output_)
else:
output_.append(input_)
例如:
input_ = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
output_ = ['a-3', 'b-3', 'x', 'hello', '3', 'b', 'r', 'j']
Pythonic解决方案可能意味着很多事情。考虑到(PEP 20),这是我对该线程的贡献:
def dec(input_, output_):
if type(input_) is list:
for subitem in input_:
dec(subitem, output_)
else:
output_.append(input_)
例如:
input_ = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
output_ = ['a-3', 'b-3', 'x', 'hello', '3', 'b', 'r', 'j']
任何iterable类型的递归展平,除了单独保留字符串(因为您可能不想将这些字符串拆分为字符):
任何iterable类型的递归展平,除了单独保留字符串(因为您可能不想将这些字符串拆分为字符):
你也可以用这样的东西:
data = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
while not all(not isinstance(x, list) for x in data):
for i in xrange(len(data)):
value = data.pop(i)
if isinstance(value, list):
data.extend(value)
else:
data.append(value)
你也可以用这样的东西:
data = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
while not all(not isinstance(x, list) for x in data):
for i in xrange(len(data)):
value = data.pop(i)
if isinstance(value, list):
data.extend(value)
else:
data.append(value)
同意,这将适用于itertools可用之前的版本。。求和(map(λi:i,如果类型(i)=列表其他[i],a),[])。。虽然我不确定sum是否打算用作列表分解器。。我希望避免使用条件句,因为它们会使事情看起来有点混乱。。我很惊讶str()和其他一些人可以使用param,但list不能认为这表明了他们对语言的良好了解,但并不是一个真正的python公式(可读性很重要,请参见我自己的答案)。干杯!:)@麦克:嗯,偏好很难讨论。你喜欢你的方式,我喜欢我的:)如果你为
lambda
创建一个函数,并使用一个好名字,比如说assure\u is\u list
,它会变得非常可读,我认为这种解决方案不太容易出错。@rafalotufo-如果你给lambda函数起一个好名字,那么你的一行程序就会违反PEP 8!;)[当然只是开玩笑…你的答案是完全正确的,而且-最重要的是-被OP选为首选答案。我无法抗拒!;)]同意,这是有效的,这将适用于itertools可用之前的版本。。求和(map(λi:i,如果类型(i)=列表其他[i],a),[])。。虽然我不确定sum是否打算用作列表分解器。。我希望避免使用条件句,因为它们会使事情看起来有点混乱。。我很惊讶str()和其他一些人可以使用param,但list不能认为这表明了他们对语言的良好了解,但并不是一个真正的python公式(可读性很重要,请参见我自己的答案)。干杯!:)@麦克:嗯,偏好很难讨论。你喜欢你的方式,我喜欢我的:)如果你为lambda
创建一个函数,并使用一个好名字,比如说assure\u is\u list
,它会变得非常可读,我认为这种解决方案不太容易出错。@rafalotufo-如果你给lambda函数起一个好名字,那么你的一行程序就会违反PEP 8!;)[当然只是开玩笑……你的答案完全正确,而且——最重要的是——被OP选为首选答案。我就是忍不住!;)]