2016-07-18 15 views
3

Ich muss eine Liste mit 5 Positionen auffüllen.Eine Liste auf eine bestimmte Weise auffüllen

new_list = ___ ___ ___ ___ ___ 

Ich erhalte 2 Listen und ich habe einen Standardwert, um die neue Liste zu füllen.

Jetzt fangen die Probleme an:

In der guten Art und Weise erhalte ich 2 Werte von listA und 2 Werte von ListeB und fügen Sie den Standardwert

A1 A2 DEFAULT B1 B2 

Aber jetzt, wenn zum Beispiel listA ist leer ich muss in einer anderen Art und Weise füllen:

DEFAULT B1 B2 B3 B4 

das gleiche, wenn ListeB leer.

Bei listA hat nur 1 Element und ListeB ein anderes Element sollte es sein:

A1 DEFAULT B1 

EDIT: die listA und ListeB haben viel mehr Objekte

+0

Was ist der Zweck ist alles davon? Vielleicht könnte es helfen, eine Lösung zu finden. –

+0

@AntoinePinsard die Idee davon ist, ein Ranking zu machen. Standardbenutzer ist der Benutzer, den ich Ranking wissen möchte. listA ist der Benutzer mit mehr Punkten als der defaultUser und listB Benutzer mit weniger Punkten als der defaultUser – 62009030

Antwort

0

Sie könnten nur Ihre Listen hinzufügen:

+0

Ist nicht möglich, weil listA und listB mehr als 2 Objekte hat, und ich muss die neue Liste mit 5 Elementen – 62009030

+0

@ 62009030 begrenzen In diesem Fall nehmen Sie nur 2 Elemente: 'listA [: 2] + listB [: 2]' – Gocht

+0

ja, aber wenn listA leer ist, brauche ich 4 aus listB – 62009030

1

Dies funktioniert in allen Fällen, auch wenn Liste B weniger als 2 Elemente lang ist, während Liste A 4 oder größer ist.

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] 

Wenn es mindestens 2 Elemente in Listen A und B sind, werden wir von 2 A nehmen und 2 von B.

Wenn es weniger als 2 Elemente in A, avail_a < 4 - avail_b, so num_a == len(list_a) . num_b wird der Rest der 4 verfügbaren Steckplätze zugewiesen. Wenn num_b größer als len(list_b) wird kein Fehler durch list_b[num_b]

geworfen werden, wenn es weniger als 2 Elemente in B wird num_a gleich entweder die verbleibende Anzahl von Schlitzen aus den 4 oder len(list_a), je nachdem, was kleiner ist.

2

Sie können dies lösen, indem Sie die Liste mit a und b rekursiv aufbauen, beginnend mit dem Standardbenutzer.

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) 

Dieses Element listA zu Beginn und ein Element der ListeB bis zum Ende hinzufügen, bis die Länge der Standardwert ist 5. wenn eine der beiden Listen leer wird, es wird einfach nichts aus dieser Liste hinzufügen, das genaue Verhalten geben, das Sie wollten.

Es geht weiter, bis entweder alle Eingabelisten der Länge 0 oder der Standardwert der Länge 5 ist. Diese Methode funktioniert auf Listen beliebiger Länge einschließlich Null, behält aber die Reihenfolge der Elemente aus Liste A nicht bei.

Einige getestet Beispiele:

>>> 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]' Argument sollte 'default = None' und dann' wenn Standardwert ist None: default = [DEFAULT_USER] '. Ansonsten: https://bpaste.net/show/b676f83bb8ca –

+0

@AntoinePinsard Ich war mir eigentlich gar nicht bewusst. Gut zu wissen. Der Code wurde aktualisiert. – zephyr1999

1

ich glaube, Sie so etwas tun kann:

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

Welche "simplifizierbar", wie er sein sollte:

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