繁体   English   中英

用多个元素替换列表中的元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM