2017-12-06 5 views
0
list1 = [['WA', 'WA'], ['DC'], ['HI'], ['NJ', 'NJ', 'NJ', 'NJ', 'NJ'], ['TX', 'TX', 'TX'], ['LA', 'LA'], ['NC'], ['NY'], ['IL', 'IL'], ['GA'], ['MA'], ['AZ']] 

list2 = [0.875, 10.875, 0, 0, 0, 0, 0.0, 0.0, 10.0, 0, 0, 0, 0.625, -0.25, 0, 10.0, 0.5, 0, 0, 10.0, 9.25] 

Ich mag die list3 so aussehen:In Python. Verwenden Sie das Format von einer Liste in einer anderen Liste

list 3 = [[0.875, 10.875], [0], [0], [0, 0, 0.0, 0.0, 10.0], [0, 0, 0], [0.625, -0.25], [0], [10.0], [0.5, 0], [0], [10.0], [9.25]] 

ich bereits den Index des list1 wie das bekommen hatte:

index_list = [[0, 1], [2], [3], [4, 5, 6, 7, 8], [9, 10, 11], [12, 13], [14], [15], [16, 17], [18], [19], [20]] 
+0

Welche Schritte haben Sie bisher versucht? –

Antwort

1

unkompliziert:

list1 = [['WA', 'WA'], ['DC'], ['HI'], ['NJ', 'NJ', 'NJ', 'NJ', 'NJ'], ['TX', 'TX', 'TX'], ['LA', 'LA'], ['NC'], ['NY'], ['IL', 'IL'], ['GA'], ['MA'], ['AZ']] 
list2 = [0.875, 10.875, 0, 0, 0, 0, 0.0, 0.0, 10.0, 0, 0, 0, 0.625, -0.25, 0, 10.0, 0.5, 0, 0, 10.0, 9.25] 

result = [] 
c = 0 
for item in list1: 
    item_len = len(item) 
    result.append(list2[c: c+item_len]) 
    c += item_len 

print(result) 

Der Ausgang:

[[0.875, 10.875], [0], [0], [0, 0, 0.0, 0.0, 10.0], [0, 0, 0], [0.625, -0.25], [0], [10.0], [0.5, 0], [0], [10.0], [9.25]] 
+0

Danke. Es hat funktioniert! –

+0

@MIKUVOCALOID, gern geschehen – RomanPerekhrest

1

Nachfolgend finden eine Lösung, die itertools.accumulate() verwendet.

from itertools import accumulate 

list1 = [['WA', 'WA'], ['DC'], ['HI'], ['NJ', 'NJ', 'NJ', 'NJ', 'NJ'], ['TX', 'TX', 'TX'], ['LA', 'LA'], ['NC'], ['NY'], ['IL', 'IL'], ['GA'], ['MA'], ['AZ']] 

list2 = [0.875, 10.875, 0, 0, 0, 0, 0.0, 0.0, 10.0, 0, 0, 0, 0.625, -0.25, 0, 10.0, 0.5, 0, 0, 10.0, 9.25] 

# temp to track the starting and ending index positions of the sublists 
temp = [0] + list(accumulate(len(x) for x in list1)) 
# [0, 2, 3, 4, 9, 12, 14, 15, 16, 18, 19, 20, 21] 

list3 = [list2[j:temp[i+1]] for i, j in enumerate(temp[:-1])] # See 1 
# >> [[0.875, 10.875], [0], [0], [0, 0, 0.0, 0.0, 10.0], [0, 0, 0], [0.625, -0.25], [0], [10.0], [0.5, 0], [0], [10.0], [9.25]] 
  1. Alternativ können Sie list3 = [list2[i:j] for i, j in zip(temp[:-1], temp[1:])] verwenden, wenn Sie es besser verstehen.
+0

Beat mich dazu! Aber ich hätte benutzt: '[list2 [a-l: a] für a, l in zip (akkumulieren (map (len, list1)), map (len, list1))]' –

+0

@ juanpa.arrivillaga Auch interessant! Macht die doppelte Verwendung von 'map (len, list1)' 'die Erstellung einer' temp'-Liste nicht recht? Das sieht meiner "Zip" -Lösung sehr ähnlich. –

+0

meh, nicht wirklich, sie sind zwei unabhängige, Single-Pass-Iteratoren. Schön und speicher effizient. Obwohl ich * zwei temporäre Variablen verwenden würde, um die 'map' Objekte zu speichern,' ls = map (len, list1); acc = ansammeln (map (len, list1)) ' –

0

Wie über eine Iterator Lösung:

list1 = [['WA', 'WA'], ['DC'], ['HI'], ['NJ', 'NJ', 'NJ', 'NJ', 'NJ'], ['TX', 'TX', 'TX'], ['LA', 'LA'], ['NC'], ['NY'], ['IL', 'IL'], ['GA'], ['MA'], ['AZ']] 

list2 = [0.875, 10.875, 0, 0, 0, 0, 0.0, 0.0, 10.0, 0, 0, 0, 0.625, -0.25, 0, 10.0, 0.5, 0, 0, 10.0, 9.25] 

f = (x for x in list2) # iterator 

list3 = [] 
for sub in list1: 
    for i, _ in enumerate(sub): 
    sub[i] = next(f) # go fetch me the next element of list2 
    list3.append(sub) 
print(list3) # -> [[0.875, 10.875], [0], [0], [0, 0, 0.0, 0.0, 10.0], [0, 0, 0], [0.625, -0.25], [0], [10.0], [0.5, 0], [0], [10.0], [9.25]]** 
0

enumerate mit Versuchen:

list3 = [] 
for i,j in enumerate(list1): 
    list3.append(list2[i:i+len(j)]) 
Verwandte Themen