140
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Giả sử tôi có một danh sách các bộ dữ liệu và tôi muốn chuyển đổi thành nhiều danh sách.
Ví dụ, danh sách các bộ dữ
[[1,2],[3,4],[5,6],]
Có bất kỳ chức năng tích hợp nào trong Python chuyển đổi nó thành:
[1,3,5],[2,4,6]
Đây có thể là một chương trình đơn giản. Nhưng tôi chỉ tò mò về sự tồn tại của chức năng tích hợp như vậy trong Python.
Martineau
Huy hiệu vàng 116K2525 gold badges160 silver badges285 bronze badges
Đã hỏi ngày 10 tháng 11 năm 2011 lúc 15:02Nov 10, 2011 at 15:02
xiaohan2012xiaohan2012xiaohan2012
9.34620 Huy hiệu vàng64 Huy hiệu bạc99 Huy hiệu Đồng20 gold badges64 silver badges99 bronze badges
Chức năng tích hợp
[1,3,5],[2,4,6]
5 sẽ gần như làm những gì bạn muốn:>>> list[zip[*[[1, 2], [3, 4], [5, 6]]]]
[[1, 3, 5], [2, 4, 6]]
Sự khác biệt duy nhất là bạn nhận được bộ dữ liệu thay vì danh sách. Bạn có thể chuyển đổi chúng thành danh sách bằng cách sử dụng
list[map[list, zip[*[[1, 2], [3, 4], [5, 6]]]]]
Đã trả lời ngày 10 tháng 11 năm 2011 lúc 15:03Nov 10, 2011 at 15:03
Sven Marnachsven MarnachSven Marnach
545K114 Huy hiệu vàng915 Huy hiệu bạc817 Huy hiệu đồng114 gold badges915 silver badges817 bronze badges
3
Từ các tài liệu Python:
Zip [] kết hợp với toán tử * có thể được sử dụng để giải nén danh sách:
Ví dụ cụ thể:
>>> zip[[1,3,5],[2,4,6]]
[[1, 2], [3, 4], [5, 6]]
>>> zip[*[[1, 2], [3, 4], [5, 6]]]
[[1, 3, 5], [2, 4, 6]]
Hoặc, nếu bạn thực sự muốn danh sách:
>>> map[list, zip[*[[1, 2], [3, 4], [5, 6]]]]
[[1, 3, 5], [2, 4, 6]]
Đã trả lời ngày 10 tháng 11 năm 2011 lúc 15:04Nov 10, 2011 at 15:04
Use:
a = [[1,2],[3,4],[5,6],]
b = zip[*a]
>>> [[1, 3, 5], [2, 4, 6]]
Đã trả lời ngày 10 tháng 11 năm 2011 lúc 15:04Nov 10, 2011 at 15:04
Artsiom Rudzenkaartsiom RudzenkaArtsiom Rudzenka
27.1k4 Huy hiệu vàng33 Huy hiệu bạc51 Huy hiệu Đồng4 gold badges33 silver badges51 bronze badges
Franklsf95 đi cho hiệu suất trong câu trả lời của anh ấy và chọn cho
[1,3,5],[2,4,6]
6, nhưng chúng không tối ưu.Thêm toàn bộ danh sách, tôi đã kết thúc với những điều sau:
def t1[zs]:
xs, ys = zip[*zs]
return xs, ys
def t2[zs]:
xs, ys = [], []
for x, y in zs:
xs.append[x]
ys.append[y]
return xs, ys
def t3[zs]:
xs, ys = [x for x, y in zs], [y for x, y in zs]
return xs, ys
if __name__ == '__main__':
from timeit import timeit
setup_string='''\
N = 2000000
xs = list[range[1, N]]
ys = list[range[N+1, N*2]]
zs = list[zip[xs, ys]]
from __main__ import t1, t2, t3
'''
print[f'zip:\t\t{timeit['t1[zs]', setup=setup_string, number=1000]}']
print[f'append:\t\t{timeit['t2[zs]', setup=setup_string, number=1000]}']
print[f'list comp:\t{timeit['t3[zs]', setup=setup_string, number=1000]}']
Điều này đã cho kết quả:
zip: 122.11585397789766
append: 356.44876132614047
list comp: 144.637765085659
Vì vậy, nếu bạn là người sau hiệu suất, có lẽ bạn nên sử dụng
[1,3,5],[2,4,6]
5 mặc dù danh sách toàn diện không quá xa. Hiệu suất của [1,3,5],[2,4,6]
8 thực sự khá kém so với so sánh.Đã trả lời ngày 18 tháng 1 năm 2018 lúc 23:08Jan 18, 2018 at 23:08
BaldrickkbaldrickkBaldrickk
4.1711 Huy hiệu vàng15 Huy hiệu bạc26 Huy hiệu đồng1 gold badge15 silver badges26 bronze badges
Mặc dù
[1,3,5],[2,4,6]
9 là Pythonic hơn, mã sau đây có hiệu suất tốt hơn nhiều:xs, ys = [], []
for x, y in zs:
xs.append[x]
ys.append[y]
Ngoài ra, khi danh sách ban đầu
>>> list[zip[*[[1, 2], [3, 4], [5, 6]]]]
[[1, 3, 5], [2, 4, 6]]
0 trống, [1,3,5],[2,4,6]
9 sẽ tăng, nhưng mã này có thể xử lý đúng.Tôi vừa chạy một thử nghiệm nhanh, và đây là kết quả:
[1,3,5],[2,4,6]
0Chạy nó nhiều lần,
[1,3,5],[2,4,6]
8 nhanh hơn 3x - 4x so với >>> list[zip[*[[1, 2], [3, 4], [5, 6]]]]
[[1, 3, 5], [2, 4, 6]]
3! Tập lệnh kiểm tra ở đây:[1,3,5],[2,4,6]
1Phiên bản Python của tôi:
[1,3,5],[2,4,6]
2Đã trả lời ngày 7 tháng 11 năm 2017 lúc 0:52Nov 7, 2017 at 0:52
franklsf95franklsf95franklsf95
1.09211 Huy hiệu bạc20 Huy hiệu đồng11 silver badges20 bronze badges
0
Ngoài câu trả lời của Claudiu, bạn có thể sử dụng:
[1,3,5],[2,4,6]
3Được chỉnh sửa theo @Peyman Mohseni Kiasari
Đã trả lời ngày 26 tháng 5 năm 2019 lúc 11:50May 26, 2019 at 11:50
1
Thêm vào câu trả lời của Claudiu và Claudiu và vì MAP cần được nhập từ itertools trong Python 3, bạn cũng sử dụng danh sách hiểu như:
[1,3,5],[2,4,6]
4Đã trả lời ngày 24 tháng 5 năm 2017 lúc 11:57May 24, 2017 at 11:57
Quickbeam2k1Quickbeam2k1Quickbeam2k1
4.9972 Huy hiệu vàng23 Huy hiệu bạc42 Huy hiệu Đồng2 gold badges23 silver badges42 bronze badges