我正在尝试将列表拆分为两个列表。这是清单:
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
语句列表?
答案 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
获得b
,c
,zip
的第一个元素,那么你就可以获得第二个元素,等等。
但是在这里我们已经通过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]