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

时间:2017-02-16 15:20:19

标签: python python-2.7 list list-comprehension

我正在尝试修改两个列表的列表。对于两个内部列表中的每一个,我执行一些操作并且分割'他们进入新的名单 以下是我尝试做的一个简单示例:

[['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],但我不知道如何修复它,因为我完全不理解列表理解。

A' pythonic'解决方案是首选。 任何反馈都将不胜感激,谢谢!

编辑:就像标题所暗示的那样,我正在尝试“替换”#39; ['a', 'b'] ['a'], ['b'] ['a'], ['b']。所以我希望这个位置能够得到满足感。相同,['c', 'd']

之前原始列表中显示{ "A": 2, "B": [ { "CCC": "abcde", "DDD": { "EEE": 11, "FFF": 22 } }, { "CCC": "fghij", "DDD": { "EEE": 111, "FFF": 222 } } ] }

结果 感谢Christian,Paul和schwobaseggl的解决方案!他们都工作:)

4 个答案:

答案 0 :(得分:2)

尝试

...  else [blist[i]])]

创建列表列表。

答案 1 :(得分:1)

您可以使用切片分配:

>> 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]]

答案 2 :(得分:1)

您可以更改分割功能以返回结构上足够的列表。然后你可以使用理解:

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]

答案 3 :(得分:0)

假设您有上述功能决定是否拆分项目:

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”是易于阅读和理解的东西。不要仅仅因为你可以使用列表推导。