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

时间:2017-02-15 10:52:00

标签: 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列表时,问题可能会扩展。

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

3 个答案:

答案 0 :(得分:5)

在第2步循环中使用ternary执行此操作,该循环调度相关列表中的上一个元素(我选择了一个快捷方式:如果值为1,则l1除此之外&#39 ; s l2,所以它相当脆弱):

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)

的产率:

[3.5, 4.5, 3.1] [7, 6, 4.8, 9]

一般情况:根据最大索引创建列表列表,并根据循环中的索引调度值(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)

结果:

[[3.5, 4.5, 3.1], [7, 6, 4.8, 9]]

更多" 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)

答案 1 :(得分: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])

<强>输出

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

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

正如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)

<强>输出

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

此算法的核心是

it = iter(lst)
for v, k in zip(it, it):

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

循环zip会产生元组,其中包含您为其提供的每个参数中的连续项。换句话说,如果你zip(a, b, c) a获得bczip的第一个元素,那么你就可以获得第二个元素,等等。

但是在这里我们已经通过it两个对zip迭代器的引用。因此,当it从两个lst中的每一个中读取下一个项目时,它会真正地通过for中的项目对。因此,在lst循环的每个循环中,我们从document.getElementById("img").style.transition = "5s ease"; 获得连续的项目对。

答案 2 :(得分:0)

不是最干净的尝试,但在这里你去了

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