python拆分列表基于condition/if else语句

key*_*key 2 python split if-statement list

我正在尝试将列表拆分为两个列表.这是清单:

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
Run Code Online (Sandbox Code Playgroud)

此外,当存在i+1粗体数字时可以扩展该问题,因此需要将其拆分为i+1列表.

我应该如何使用if- else列表的陈述?

Jea*_*bre 5

在第2步循环中使用三元组来调度相关列表中的前一个元素(我采用了一个快捷方式:如果值是1,那么它就是l1l2,所以它相当脆弱):

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

l1,l2 = [],[]
for i in range(1,len(l),2):
    (l1 if l[i]==1 else l2).append(l[i-1])

print(l1,l2)
Run Code Online (Sandbox Code Playgroud)

收益率:

[3.5, 4.5, 3.1] [7, 6, 4.8, 9]
Run Code Online (Sandbox Code Playgroud)

一般情况:根据最大索引创建列表列表,并根据循环中的索引调度值(l[i]-1是0开始索引,l[i]是要插入的值)

lists = [[] for _ in range(max(l[1::2]))]

for i in range(1,len(l),2):
    lists[l[i]-1].append(l[i-1])

print(lists)
Run Code Online (Sandbox Code Playgroud)

结果:

[[3.5, 4.5, 3.1], [7, 6, 4.8, 9]]
Run Code Online (Sandbox Code Playgroud)

更多"pythonic"用于最后一部分itertools.islice而不是使用索引:

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)
Run Code Online (Sandbox Code Playgroud)


PM *_*ing 5

您可以使用字典来保存新列表,使用类别编号作为字典键.我们使用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])
Run Code Online (Sandbox Code Playgroud)

产量

1 [3.5, 4.5, 3.1]
2 [7, 6, 4.8, 9]
Run Code Online (Sandbox Code Playgroud)

此代码可以处理任意数量的类别.

正如Jean-FrançoisFabre在评论中提到的那样,按照排序顺序进行打印的方法稍微有效一些.

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)
Run Code Online (Sandbox Code Playgroud)

产量

1 [3.5, 3.1]
2 [7, 6, 9]
3 [4.5, 4.8]
Run Code Online (Sandbox Code Playgroud)

这个算法的核心是

it = iter(lst)
for v, k in zip(it, it):
Run Code Online (Sandbox Code Playgroud)

it = iter(lst)从列表中创建一个迭代器对象.然后我们将该迭代器的两个副本传递给zip.

循环zip产生元组,其中包含您为其提供的每个参数中的连续项.换句话说,如果你做zip(a, b, c)你的每一个的第一要素a,b,c,那么你会得到他们的第2个元素等

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