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

2024-04-26 01:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下问题。你知道吗

我有一个对称项的列表,例如k = [-1,1,-2,2,-3,3]。根据项目数(Ni),我想创建另一个列表e,使用它的方式如下:列表k的每个项目在列表e中最多可以生成2个项目,但是列表e的填充有一个“顺序”。你知道吗

例如,如果我们有Ni=4,那么e中有4项。我将按照以下方式填充ek的每个项可以“支持”2个值。由于第二个值只有在对称且对应的值被填充之后才被填充,如我们在本例中有4,e的第一项是-1,第二项是1,第三项是-1,最后第四项是1。你知道吗

如果我有Ni=5,第五个元素是-2,第六个元素是2,第七个元素是-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]

例7:Ni = 8

e=[-1,1,-1,1,-2,2,-2,2]

提前感谢您的帮助、想法、建议等!你知道吗


Tags: 项目代码in元素列表forinput顺序
2条回答
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))
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]

相关问题 更多 >