我对以下问题感到困扰。
我有一个包含对称项的列表,例如k = [-1,1,-2,2,-3,3]
。根据项目数量(Ni
),我想创建另一个列表e
,使用它以下列方式:列表k
的每个项目都可以生成最大值。列表e
中有2个项目,但是填写列表e
有一个“顺序”。
例如,如果我们有Ni=4
,则e
中有4个项目。我将按照以下方式填写e
:k
的每个项目都可以“支持”2个值。由于第二个值仅在其对称且相应的值被填充之后被填充,因为在此示例中我们有4个,e
的第一项是-1
,第二个是1
, 3,再次-1
,最后第4个是1
。
如果我有Ni=5
,则第五个元素为-2
,第六个元素为2
,第7个元素,-2
和第八个2
。以下示例说明了这一点。
我的初始代码是:
k=[-1,1,-2,2,-3,3]
Ni=input("Ni: ")
e=[]
temp = 1
for i in k:
e.append(i)
temp+=1
if temp>Ni:
break
---
然后我得到
e = [-1,1,-2,2,-3]
这个结果当然不是我想要的。以下示例更好地说明了我的意思。
示例0:Ni = 1
该列表将是:
e=[-1]
示例1:Ni = 2
列表'e'将是:
e=[-1,1]
示例2:Ni = 3
e=[-1,1,-1]
实施例。 3:Ni = 4
e=[-1,1,-1,1]
实施例。 4:Ni = 5
e=[-1,1,-1,1,-2]
实施例。 5:Ni = 6
e=[-1,1,-1,1,-2,2]
实施例。 6:Ni = 7
e=[-1,1,-1,1,-2,2,-2]
Ex.7:Ni = 8
e=[-1,1,-1,1,-2,2,-2,2]
提前感谢任何帮助,想法,建议等!
答案 0 :(得分:0)
Ni = int(input("Select number of items: "))
k = [-1,1,-2,2,-3,3]
if Ni <= len(k) + 2:
if Ni <= 2:
e = k[0:Ni]
else:
e = [x for x in sorted(k[0:2]*2) + k[2:len(k)]][0:Ni]
答案 1 :(得分:0)
import itertools
def fill(k, Ni):
return sorted(list(itertools.islice(itertools.chain.from_iterable(zip(itertools.chain.from_iterable((k[i], k[i+1])*2 for i in range(0,len(k),2)), )), 0, Ni)), key=lambda i:(abs(i), i))
或者,更易读的版本:
def fill(k, Ni):
return sorted(list(
itertools.islice(
itertools.chain.from_iterable(
zip(
itertools.chain.from_iterable((k[i], k[i+1])*2 for i in range(0,len(k),2)),
)
),
0, Ni
)
), key=lambda i:(abs(i), i))