2017-02-15 78 views
2

我试图将一个列表分成两个列表。这里的列表:基于条件/ if else语句的python分割列表

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

如果我想基于在POS粗体数字(1或2),它总是偶数(2×)分裂列表银行足球比赛,所以前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

请显示你的努力:)粘贴你的代码将是好的 – 0Tech

+0

像0Tech说,展示你到目前为止。但也澄清,这些数字1和2的位置或标志。 – sten

+1

@Roxanne您的编辑弄乱了'L'列表中的粗体文本。 –

回答

5

做的是在步骤2环路调度在相关列表中的前一个元素使用三元(我参加了一个捷径:如果值是1,这是l1否则它的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 -starting指数和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]] 

更 “Python的” 使用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) 
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] 
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)你每个abc,那么你会得到他们的第二元素的第一元素等

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

+0

'对于排序后的(d.keys())中的k:':你最好'为k,v在排序后(d.items()):'所以你不需要做'd [k]'在你的循环中。 –

+0

@ Jean-FrançoisFabre谢谢。为什么我没有想到这个? ;)并且对于sort(d.items())中的t:print(* t)'是另一个选项。 –