假设我有一个这样的列表:
lst = ['apple orange', 'banana', 'grape']
我知道list[0].split()
只会返回一个包含['apple', 'orange']
的列表,但我想在一个简单的sol'n中实现以下内容:
lst = ['apple', 'orange', 'banana', 'grape']
例2:
我们说这个清单是:
lst = ['apple orange', 'banana', 'grape', 'foo fi']
而我只想要
lst = ['apple', 'orange', 'banana', 'grape', 'foo fi']
我怎么能在单行sol'n中做到这一点?
(如果某些上下文有帮助,我们假设它不会总是在索引位置0)
您可以使用模拟解包的列表推导:
lst = ['apple orange', 'banana', 'grape']
new_lst = [w for s in lst for w in s.split()]
print(new_lst)
# ['apple', 'orange', 'banana', 'grape']
它相当于这个更简洁但无效的版本:
new_lst = [*s.split() for s in lst]
不幸的是,列表推导中不允许这样拆包,这就是为什么我们必须使用上面的解决方法。
编辑问题解决方案:
index = 1 # or whatever
lst = ['banana', 'apple orange', 'grape']
lst[index:index + 1] = lst[index].split()
print(lst)
以上工作原地;如果你想创建一个副本,你可以使用上面的副本,但制作副本或:
index = 1 # or whatever
lst = ['banana', 'apple orange', 'grape']
new_lst = lst[:index] + lst[index].split() + lst[index + 1:]
print(new_lst)
对于你的第二个问题,你可以使用slicing
def split_at(l, i):
return l[:i] + l[i].split() + l[i+1:]
例如:
>>> split_at(l,0)
['apple', 'orange', 'banana', 'grape', 'foo fi']
>>> split_at(l,3)
['apple orange', 'banana', 'grape', 'foo', 'fi']