[英]Replacing an element in a list with multiple elements
我试图修改两个列表的列表。 对于两个内部列表中的每一个,我执行一些操作并将它们“拆分”为新列表。
这是我正在尝试做的一个简单示例:
[['a', 'b'], ['c', 'd']] --> [['a'], ['b'], ['c', 'd']]
目前我的算法将['a', 'b']
传递给一个函数,该函数确定它是否应该被分成[['a'], ['b']]
(例如根据它们的相关性)。 在函数返回[['a'], ['b']]
它告诉我, ['a', 'b']
应当被拆分,或返回['a', 'b']
原始列表),其表示不应拆分。
目前我有这样的事情:
blist = [['a', 'b'], ['c', 'd']] #big list
slist = [['a'], ['b']] #small list returned by function
nlist = [items for i in xrange(len(blist)) for items in (slist if i==0 else blist[i])]
这产生[['a'], ['b'], 'c', 'd']
而不是所需的输出[['a'], ['b'], ['c', 'd']]
不会改变原始blist中的第二个列表。 我理解为什么会发生这种情况 - 在这种情况下我的第二个循环也适用于blist[1]
,但我不知道如何修复它,因为我完全不理解列表理解。
“pythonic”溶液是优选的。 任何反馈将不胜感激,谢谢!
编辑 :就像标题所暗示的那样,我试图用['a'], ['b']
'替换' ['a', 'b']
['a'], ['b']
。 所以我希望“位置”相同,在['c', 'd']
之前原始列表中出现['a'], ['b']
['c', 'd']
结果谢谢Christian,Paul和schwobaseggl的解决方案! 他们都工作:)
尝试
... else [blist[i]])]
创建列表列表。
您可以使用切片分配:
>> l1 = [[1, 2], [3, 4]]
>>> l2 = [[1], [2]]
>>> l1[0:1] = l2
>>> l1
[[1], [2], [3, 4]]
这会改变l1
,所以如果你想保留它之前做一个副本。
另一种不改变l1
是添加:
>> l1 = [[1, 2], [3, 4]]
>>> l3 = l2 + l1[1:]
>>> l3
[[1], [2], [3, 4]]
您可以更改拆分功能以返回结构上足够的列表。 然后你可以使用理解:
def split_or_not(l):
if condition: # split
return [l[:1], l[1:]]
return [l] # wrap in extra list
# using map
nlist = [x for sub_l in map(split_or_not, blist) for x in sub_l]
# or nested comprehension
nlist = [x for sub_l in (split_or_not(l) for l in blist) for x in sub_l]
假设您有上述功能决定是否拆分项目:
def munch(item):
if item[0] == 'a': # split
return [[item[0]], [item[1]]]
return [item] # don't split
您可以在简单的for循环中使用它。
nlist = []
for item in blist:
nlist.extend(munch(item))
“Pythonic”是易于阅读和理解的东西。 不要仅仅因为你可以使用列表推导。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.