2017-07-21 28 views
6

Có thể giải nén một danh sách các số vào danh sách danh sách không? Ví dụ tôi có một danh sách với trong một danh sách chứa các số như thế này:Mở một Danh sách vào Chỉ mục của một danh sách khác trong python

a = [[25,26,1,2,23], [15,16,11,12,10]] 

tôi cần phải đặt chúng trong một mô hình vì vậy tôi đã làm một cái gì đó như thế này

newA = [] 

for lst in a: 
    new_nums = [lst[4],lst[2],lst[3],lst[0],lst[1]] 
    newA.append(new_nums) 

print (newA) # prints -->[[23, 1, 2, 25, 26], [10, 11, 12, 15, 16]] 

nên thay vì viết new_nums = [lst[4],lst[2],lst[3],lst[0],lst[1]], i suy nghĩ về việc xác định một mẫu như danh sách được gọi là pattern = [4,2,3,0,1] và sau đó giải nén các mẫu này vào các chỉ mục đó theo số lst để tạo thứ tự mới là lst.

Có cách nào tốt để thực hiện việc này không.

+0

@sapensadler Mục tiêu của tôi không phải là tạo danh sách phẳng, nhưng để giữ cấu trúc danh sách như cũ và thay đổi thứ tự chỉ mục bằng cách chuyển danh sách tùy chỉnh các số – Watarap

Trả lời

6

Cho một danh sách các chỉ số gọi là pattern, bạn có thể sử dụng danh sách hiểu như vậy:

new_lst = [[lst[i] for i in pattern] for lst in a] 
2

Nếu bạn không phản đối việc sử dụng NumPy, sau đó thử một cái gì đó như:

import numpy as np 

pattern = [4, 2, 3, 0, 1] 

newA = [list(np.array(lst)[pattern]) for lst in a] 

Hy vọng nó giúp.

2

Trong Python tinh khiết, bạn có thể sử dụng danh sách hiểu:

pattern = [4,2,3,0,1] 

newA = [] 

for lst in a: 
    new_nums = [lst[i] for i in pattern] 
    newA.append(new_nums) 

Trong NumPy , bạn có thể sử dụng tính năng lập chỉ mục ưa thích:

>>> [np.array(lst)[pattern].tolist() for lst in a] 
[[23, 1, 2, 25, 26], [10, 11, 12, 15, 16]] 
0

nó chậm hơn so với khác, nhưng nó là một lựa chọn khác. bạn có thể sắp xếp danh sách dựa trên mô hình của bạn

a = [[25,26,1,2,23], [15,16,11,12,10]] 
pattern = [4,2,3,0,1] 
[sorted(line,key=lambda x:pattern.index(line.index(x))) for line in a] 
[[23, 1, 2, 25, 26], [10, 11, 12, 15, 16]] 
3

operator.itemgetter cung cấp ánh xạ chức năng hữu ích:

from operator import itemgetter 
a = [[25,26,1,2,23], [15,16,11,12,10]] 
f = itemgetter(4,2,3,0,1) 
print [f(x) for x in a] 

[(23, 1, 2, 25, 26), (10, 11, 12, 15, 16)]

Sử dụng danh sách liệt kê thay vì danh sách các bộ.

Các vấn đề liên quan