基于条件/if-else语句的python拆分列表

基于条件/if-else语句的python拆分列表,python,list,if-statement,split,Python,List,If Statement,Split,我试着把一个列表分成两个列表。清单如下: L=[3.5,1,7,2,4.5,1,6,2,4.8,2 ,3.1,1,9,2] 如果我想根据粗体数字(1或2)拆分列表,粗体数字始终是位置中的偶数(2x),因此1之前的数字将转到一个列表,2之前的数字将转到另一个列表: l1 = [3.5, 4.5, 3.1] #bold number = 1 l2 = [7, 6, 4.8, 9] #bold number = 2 此外,当存在i+1粗体数字时,问题可能会扩展,因此需要拆分为i+1列表 我应该如何

我试着把一个列表分成两个列表。清单如下:

L=[3.5,1,7,2,4.5,1,6,2,4.8,2 ,3.1,1,9,2]

如果我想根据粗体数字(1或2)拆分列表,粗体数字始终是位置中的偶数(2x),因此1之前的数字将转到一个列表,2之前的数字将转到另一个列表:

l1 = [3.5, 4.5, 3.1] #bold number = 1

l2 = [7, 6, 4.8, 9] #bold number = 2
此外,当存在
i+1
粗体数字时,问题可能会扩展,因此需要拆分为
i+1
列表


我应该如何使用
if
-
else
语句作为列表?

在步骤2循环中使用三元组来调度相关列表中的前一个元素(我选择了一个快捷方式:如果值是
1
,它是
l1
,否则它是
l2
,所以它相当脆弱):

收益率:

[3.5, 4.5, 3.1] [7, 6, 4.8, 9]
一般情况:根据最大索引创建列表列表,并根据循环中的索引分派值(
l[i]-1
是0起始索引,
l[i]
是要插入的值)

结果:

[[3.5, 4.5, 3.1], [7, 6, 4.8, 9]]
在最后一部分中,使用
itertools.islice
而不是使用索引进行更多的“pythonic”:

import itertools
for i,v in zip(itertools.islice(l,1,len(l),2),itertools.islice(l,0,len(l),2)):
    lists[i-1].append(v)

这不是最干净的尝试,但给你

>>> L=[3.5, 1 ,7, 2 ,4.5, 1, 6, 2, 4.8, 2 ,3.1,1, 9, 2]
>>> o=zip(L, L[1:])[::2]
>>> o
[(3.5, 1), (7, 2), (4.5, 1), (6, 2), (4.8, 2), (3.1, 1), (9, 2)]
>>> map(lambda x: x[0], filter(lambda x: x[1]%2==0, o))
[7, 6, 4.8, 9]
>>> map(lambda x: x[0], filter(lambda x: x[1]%2!=0, o))
[3.5, 4.5, 3.1]

您可以使用字典保存新列表,使用类别号作为字典键。我们使用defaultdict来简化在字典中创建列表的过程

from collections import defaultdict

lst = [3.5, 1 ,7, 2, 4.5, 1, 6, 2, 4.8, 2, 3.1, 1, 9, 2]

# Separate data into different lists based on following number
d = defaultdict(list)
it = iter(lst)
for v, k in zip(it, it):
    d[k].append(v) 

# Display lists
for k in sorted(d.keys()):
    print(k, d[k])
输出

1 [3.5, 4.5, 3.1]
2 [7, 6, 4.8, 9]
1 [3.5, 3.1]
2 [7, 6, 9]
3 [4.5, 4.8]
此代码处理任意数量的类别

正如Jean-François Fabre在评论中提到的,有一种更有效的方法可以按顺序进行打印

from collections import defaultdict

lst = [3.5, 1 ,7, 2, 4.5, 3, 6, 2, 4.8, 3, 3.1, 1, 9, 2]

# Separate data into different lists based on following number
d = defaultdict(list)
it = iter(lst)
for v, k in zip(it, it):
    d[k].append(v) 

# Display lists
for k, v in sorted(d.items()):
    print(k, v)
输出

1 [3.5, 4.5, 3.1]
2 [7, 6, 4.8, 9]
1 [3.5, 3.1]
2 [7, 6, 9]
3 [4.5, 4.8]
该算法的核心是

it = iter(lst)
for v, k in zip(it, it):
从列表中创建迭代器对象。然后我们将该迭代器的两个副本传递给

zip
上循环会产生元组,其中包含您提供给它的每个参数的连续项。换句话说,如果你做了
zip(a,b,c)
你得到了
a
b
c
中每一个的第一个元素,然后你得到了它们的第二个元素,等等


但是这里我们已经传递了对
it
迭代器的两个引用。因此,当
zip
从两个
中的每一个读取下一个项目时,它实际上是通过
lst
中的项目对工作的。因此,在
for
循环的每个循环上,我们从
lst
获得连续的项目对

请展示你的努力:)粘贴你的代码是可以的,就像0Tech所说的,展示你到目前为止所做的。但也要澄清,这些数字是1和2的位置还是标志。@Roxanne您的编辑弄乱了
L
列表中的粗体文本。@pm2我的错。下次我会仔细检查谢谢你的提示@PM2Ring!我想我只能通过点击“向上投票”来为人们授予荣誉,而我没有这样做的权力。(我现在做了)
对k进行排序(d.keys()):
:你最好对k进行
,对v进行排序(d.items()):
这样你就不需要在循环中进行
d[k]
。@Jean-Françoisfare谢谢。为什么我没有想到这一点而
对于排序中的t(d.items()):print(*t)
是另一个选项。