2016-07-18 78 views
3

我需要用5個位置填充列表。以特定方式填充列表

new_list = ___ ___ ___ ___ ___ 

我收到2個列表,我有一個默認值來填充新列表。

現在啓動問題:

在好辦法,我收到來自數組listB從listA的2個值和2點的值,並添加默認值

A1 A2 DEFAULT B1 B2 

但現在,例如,如果listA的是空的我需要以另一種方式填充:

DEFAULT B1 B2 B3 B4 

如果listB爲空,則相同。

如果listA的只是有1元,和數組listB另一個元素應該是:

A1 DEFAULT B1 

編輯:listA的和數組listB有更多的對象

+0

是什麼目的所有這些?也許它可以幫助找到解決方案。 –

+0

@AntoinePinsard這個想法是做一個排名。默認用戶是我想知道排名的用戶。 listA是比defaultUser和listB用戶點數少於默認用戶點數的用戶 – 62009030

回答

0

您可以只添加你的列表:

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

是不可能的,因爲listA和listB每個都有2個以上的對象,我必須用5個元素限制新列表 – 62009030

+0

@ 62009030在這種情況下,只需要2個元素:'listA [:2] + listB [:2]' – Gocht

+0

是的,但是如果listA爲空,我需要listB – 62009030

1

這將適用於所有情況,包括列表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] 

如果在表A和表B中的至少2個元素,我們將需要2選自A,和2從B.

如果在A,avail_a < 4 - avail_b小於2組的元素,所以num_a == len(list_a)num_b將得到4個可用插槽的剩餘部分。如果num_blen(list_b)較大沒有錯誤將由list_b[num_b]

如果有小於2層的元件B中,num_a將等於或者剩餘數目的時隙出4,或len(list_a)中較小的一個被拋出。

2

您可以通過遞歸地使用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] 
+1

'default = [DEFAULT_USER]'參數應該是'default = None',然後'如果默認值是None:default = [DEFAULT_USER]'。否則:https://bpaste.net/show/b676f83bb8ca –

+0

@AntoinePinsard我實際上完全不知道這種行爲。很高興知道。代碼已更新。 – zephyr1999

1

我認爲你可以做這樣的事情:

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

這應該是 「simplifiable」 爲:

new_list = listA + [DEFAULT] + listB 
new_list = new_list[:(len(listA) + 1 + max(2, 4 - len(listA)))][-5:]