在Python中创建另一个术语列表

时间:2014-08-26 21:34:35

标签: python list

我对以下问题感到困扰。

我有一个包含对称项的列表,例如k = [-1,1,-2,2,-3,3]。根据项目数量(Ni),我想创建另一个列表e,使用它以下列方式:列表k的每个项目都可以生成最大值。列表e中有2个项目,但是填写列表e有一个“顺序”。

例如,如果我们有Ni=4,则e中有4个项目。我将按照以下方式填写ek的每个项目都可以“支持”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]

提前感谢任何帮助,想法,建议等!

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