Python 以特定方式填充列表
我需要用5个位置填充一个列表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
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:]