我正在尝试修改两个列表的列表。对于两个内部列表中的每一个,我执行一些操作并且分割'他们进入新的名单 以下是我尝试做的一个简单示例:
[['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的解决方案!他们都工作:)
答案 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”是易于阅读和理解的东西。不要仅仅因为你可以使用列表推导。