Python 以特定方式填充列表

Python 以特定方式填充列表,python,list,populate,Python,List,Populate,我需要用5个位置填充一个列表 new_list = ___ ___ ___ ___ ___ 我收到2个列表,我有一个默认值来填充新列表 现在开始解决问题: 以一种好的方式,我从listA接收到2个值,从listB接收到2个值,并添加默认值 A1 A2 DEFAULT B1 B2 但是现在,如果listA是空的,我需要用另一种方式填充: DEFAULT B1 B2 B3 B4 如果listB为空,则相同 如果listA只有一个元素,而listB只有另一个元素,那么它应该是: A1 DEFA

我需要用5个位置填充一个列表

new_list =  ___ ___ ___ ___ ___
我收到2个列表,我有一个默认值来填充新列表

现在开始解决问题:

以一种好的方式,我从listA接收到2个值,从listB接收到2个值,并添加默认值

A1 A2 DEFAULT B1 B2
但是现在,如果listA是空的,我需要用另一种方式填充:

DEFAULT B1 B2 B3 B4
如果listB为空,则相同

如果listA只有一个元素,而listB只有另一个元素,那么它应该是:

A1 DEFAULT B1

编辑:listA和listB有更多的对象

您可以添加列表:

new_list = listA + listB
# add the default value
new_list.append(DEFAULT)

这在所有情况下都有效,包括列表B的长度小于2个元素,而列表A的长度大于等于4个元素

avail_a = len(list_a)
avail_b = min(len(list_b), 2)  # assume that we are taking max 2 elements from B
num_a = min(avail_a, 4 - avail_b)  # take either all of A (if len < 2), or remainder from the total
num_b = 4 - num_a  # take (up to) remainder of total

final_list = list_a[:num_a] + [DEFAULT] + list_b[:num_b]
avail\u a=len(列表a)
avail_b=min(len(list_b),2)#假设我们从b中获取最多2个元素
num_a=min(avail_a,4-avail_b)#取全部a(如果len<2),或取总数的余数
num_b=4-num_a#取(最多)总数的剩余部分
最终列表=列表a[:num\u a]+[默认值]+列表b[:num\u b]
如果列表A和B中至少有2个元素,我们将从A中取2,从B中取2

如果A中的元素少于2个,
avail\u A<4-avail\u b
,则
num\u A==len(list\u A)
num_b
将分配4个可用插槽的剩余部分。如果
num\u b
大于
len(list\u b)
list\u b[num\u b]不会引发错误。


如果B中的元素少于2个,
num\u a
将等于4个插槽中剩余的插槽数,或
len(list\u a)
,以较小者为准。

您可以通过从默认用户开始,用a和B递归构建列表来解决此问题

def build_list(listA,listB,default=None):
    if default is None:
        default = [DEFAULT_USER]
    if len(default) == 5 or len(listA) + len(listB) == 0:
        return default
    else:
        default = listA[:1] + default + listB[:1]
        return build_list(listA[1:],listB[1:],default)
这将在开始处添加一个listA元素,在结束处添加一个listB元素,直到默认长度为5。如果其中任何一个列表变为空,它只会从该列表中不添加任何内容,给出您想要的确切行为

它一直运行,直到所有输入列表的长度为0或默认长度为5。此方法适用于任何长度(包括零)的列表,但不会保留列表A中元素的顺序

一些测试示例:

>>> DEFAULT_USER=1000
>>> build_list([1],[2])
[1,1000,2]
>>> build_list([],[1,2,3,4,5,6,7,8,9])
[1000, 1, 2, 3, 4]
>>> build_list([1,2,3,4,5],[6,7,8,9,10])
[2, 1, 1000, 6, 7]
>>> build_list([1,2,3,4,5,6,7,8,9],[])
[4, 3, 2, 1, 1000]

我想你可以这样做:

new_list = [DEFAULT]

# First append listB elements from start until you reach the end
# or until you append enough elements according to the length of listA
i = 0
b_limit = min(len(listB), max(2, 4 - len(listA)))
while i < b_limit:
    new_list.append(listB[i])

# Then prepend listA elements from end until you raech the start
# or until you've got a total of 5 elements.
i = 0
a_limit = min(len(listA), 5-len(new_list))
while i < a_limit:
    new_list.insert(0, listB[-i-1])

这是不可能的,因为listA和listB每个都有2个以上的对象,我必须将新列表限制为5个elements@62009030在这种情况下,只取2个元素:
listA[:2]+listB[:2]
是的,但是如果listA是空的,我需要listBand中的4个如果listA有1个项目,listB有5个,那么listB中有多少个呢,如果listB是空的呢?这一切的目的是什么?也许它能帮助找到一个解决办法。@AntoinePinsard这个想法是为了排名。默认用户是我想知道排名的用户。listA是比defaultUser点数多的用户,listB是比defaultUser点数少的用户
default=[default\u USER]
参数应该是
default=None
,然后是
如果default是None:default=[default\u USER]
。否则:@AntoinePinsard我实际上完全没有意识到这种行为。很高兴知道。代码已更新。
new_list = listA + [DEFAULT] + listB
new_list = new_list[:(len(listA) + 1 + max(2, 4 - len(listA)))][-5:]