তালিকাগুলির তালিকা স্থানান্তর করুন


241

চলুন:

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ফলাফল আমি খুঁজছি

r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

এবং না

r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

অনেক প্রশংসিত

উত্তর:


336

কেমন

map(list, zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

অজগর জন্য 3.x ব্যবহারকারীরা ব্যবহার করতে পারেন

list(map(list, zip(*l)))

ব্যাখ্যা:

কী চলছে তা বুঝতে আমাদের দুটি বিষয় জানতে হবে:

  1. জিপের স্বাক্ষর : zip(*iterables)এর অর্থ zipপ্রতারণামূলক হতে হবে এমন প্রতিটি আর্গুমেন্টের স্বেচ্ছাসেবী সংখ্যার প্রত্যাশা। যেমন zip([1, 2], [3, 4], [5, 6])
  2. প্যাক করা নেই যুক্তি তালিকা : আর্গুমেন্ট একটি ক্রম দেওয়া args, f(*args)ডাকব fযেমন যে প্রতিটি উপাদান argsএকটি পৃথক অবস্থানগত যুক্তি f

প্রশ্ন থেকে ইনপুট ফিরে আসছে l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]], zip(*l)সমতূল্য হবে zip([1, 2, 3], [4, 5, 6], [7, 8, 9])। বাকিগুলি কেবল ফলাফলটি তালিকার তালিকার পরিবর্তে তালিকার একটি তালিকা কিনা তা নিশ্চিত করছে।


67
সাবধান: যদি lসমান আকারের না হয় (বলুন, কিছু সারি অন্যের তুলনায় ছোট) তবে এর জন্য ক্ষতিপূরণ দেওয়া zipহবে না এবং পরিবর্তে আউটপুট থেকে সারিগুলি কেটে দেওয়া হবে । তাই l=[[1,2],[3,4],[5]]আপনাকে দেয় [[1,3,5]]
Badp

29
itertoolsফাংশন zip_longest()অমসৃণ তালিকা সাথে কাজ করে। ডকস
ওরেগানো

13
উত্তরের একটি ব্যাখ্যা চমৎকার হবে :)
বরিস চুরজিন

7
আমি মনে করি list(zip(*l))পাইথন 3 এ এমনকি সঠিকভাবে কাজ করে
স্টেফানো

3
@ স্টেফানো এটি কাজ করে ( zip(*l)পাইথন ২- তেও কাজ করে ) তবে আপনি তালিকার একটি তালিকা পাবেন, তালিকার একটি তালিকা নয়। অবশ্যই, list(list(it))সর্বদা হিসাবে একই জিনিস list(it)
অ্যালেক্স শপিলকিন

62

এটি করার একটি উপায় হ'ল নুমপি ট্রান্সপোজ। একটি তালিকার জন্য, একটি:

>>> import numpy as np
>>> np.array(a).T.tolist()
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

বা জিপ ব্যতীত অন্য একটি:

>>> map(list,map(None,*a))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

8
আপনার দ্বিতীয়টিকে ভালবাসুন - আমি বুঝতে পারি নি mapযে এটি করতে পারে। এখানে একটি সামান্য পরিশোধন রয়েছে যার জন্য 2 টি কল প্রয়োজন নেই, যদিও:map(lambda *a: list(a), *l)
লি ডি

7
এটি অসম তালিকার যত্ন নেওয়ার কারণে এটির আরও ভাল উত্তর হওয়া উচিত নয়?
লিওন

15
map(None, ...)পাই 3 এর জন্য কাজ করে না বলে মনে হচ্ছে। জেনারেটরের নির্মিত হয় কিন্তু next()অবিলম্বে একটি ত্রুটি উত্থাপন: TypeError: 'NoneType' object is not callable
ম্যাড পদার্থবিদ

57

জেনার সমাধানের সাথে সমান:

>>> l=[[1,2,3],[4,5,6],[7,8,9]]
>>> [list(i) for i in zip(*l)]
... [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

12
যেহেতু তালিকার উপলব্ধি এখন পছন্দ করা হয়েছে map(), পাইথন স্পিরিটে
সলিউশনটিই

26

কেবল মজাদার জন্য, বৈধ আয়তক্ষেত্রগুলি এবং ধরে নেওয়া যে এম [0] বিদ্যমান

>>> m = [[1,2,3],[4,5,6],[7,8,9]]
>>> [[row[i] for row in m] for i in range(len(m[0]))]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

এই আমি যা খুঁজছিলাম এবং আমার মাথা পেতে পারে না। এখনও @ Jena এর সমাধান সত্যিই ছোট
তিতাস

3
হ্যাঁ, এই অধিকারটি পেতে কয়েক টায়ার লাগল। ঠিক আছে, অনেক চেষ্টা করে।
ম্যাচিউ

9
এখনও বেশ সঠিক নয় - মাত্রাগুলি বর্গক্ষেত্রের ক্ষেত্রে কাজ করার ক্ষেত্রে এটি ঘটে! এটা তোলে হওয়া উচিত: [[j[i] for j in l] for i in range(len(l[0]))]। অবশ্যই, আপনাকে অবশ্যই নিশ্চিত হতে হবে যে তালিকাটি lখালি নয়।
লি ডি

@ লিড এখনও জেনার উদাহরণে আমার জন্য কাজ করে না l = [[১,২], [৩,৪], [৫]]
hobs

3
@ হবস জেনাকে প্রতিক্রিয়া জানাতে এটি ব্যাডের উদাহরণ ছিল। তবে আমি নিশ্চিত নই যে এটি আমার কাছে বোধগম্য। আইএমও, স্থানান্তর একটি আয়তক্ষেত্রাকার ম্যাট্রিক্স বোঝায় - যখন তালিকার তালিকা হিসাবে উপস্থাপিত হয়, তার অর্থ সমস্ত অভ্যন্তরীণ তালিকা একই দৈর্ঘ্য হতে হবে। এই উদাহরণটির "প্রতিস্থাপন" হিসাবে আপনি কী ফলাফল চান?
লি ডি

22

পাইথন 2 বা 3 এ পদ্ধতিগুলি 1 এবং 2 কাজ করে এবং তারা রাগযুক্ত, আয়তক্ষেত্র 2D তালিকায় কাজ করে । এর অর্থ অভ্যন্তরীণ তালিকাগুলি একে অপরের (রাগযুক্ত) বা বাহ্যিক তালিকার (আয়তক্ষেত্রাকার) সমান দৈর্ঘ্যের প্রয়োজন নেই। অন্যান্য পদ্ধতিগুলি, ভাল, এটি জটিল।

সেটআপ

import itertools
import six

list_list = [[1,2,3], [4,5,6, 6.1, 6.2, 6.3], [7,8,9]]

পদ্ধতি 1 - map(),zip_longest()

>>> list(map(list, six.moves.zip_longest(*list_list, fillvalue='-')))
[[1, 4, 7], [2, 5, 8], [3, 6, 9], ['-', 6.1, '-'], ['-', 6.2, '-'], ['-', 6.3, '-']]

six.moves.zip_longest() হয়ে

ডিফল্ট ফিলভ্যালু হয় None। @ জেনার জবাবের জন্য ধন্যবাদ , যেখানে map()অন্তর্নির্মিত তালিকাগুলিকে তালিকায় পরিবর্তন করা হচ্ছে। এখানে এটি পুনরাবৃত্তিকে তালিকায় পরিণত করছে। @ ওরেগানো এবং @ ব্যাপ্পের মন্তব্যে ধন্যবাদ

পাইথন 3 এ, list()পদ্ধতি 2 হিসাবে একই 2D তালিকা পেতে ফলাফলটি পাস করুন ।


পদ্ধতি 2 - তালিকা উপলব্ধি, zip_longest()

>>> [list(row) for row in six.moves.zip_longest(*list_list, fillvalue='-')]
[[1, 4, 7], [2, 5, 8], [3, 6, 9], ['-', 6.1, '-'], ['-', 6.2, '-'], ['-', 6.3, '-']]

@ InspectorG4dget বিকল্প


পদ্ধতি 3 - map()এর map()- পাইথন 3.6 এ ভাঙা

>>> map(list, map(None, *list_list))
[[1, 4, 7], [2, 5, 8], [3, 6, 9], [None, 6.1, None], [None, 6.2, None], [None, 6.3, None]]

এই অসাধারণভাবে কমপ্যাক্ট @ সিগিএফএফ দ্বিতীয় বিকল্পটি তার প্রথম কোডের বিপরীতে র‌্যাগড 2 ডি তালিকার সাথে কাজ করে যা র‌্যাগড তালিকাগুলি স্থানান্তর করতে এবং পাস করার জন্য অসাধারণ ব্যবহার করে। তবে কোনওটিই পূরণের মান হতে পারে না। (না, অভ্যন্তরীণ মানচিত্রে কোনটিই পাস করা হয়নি) পূরণের মান নয় It এর অর্থ প্রতিটি কলামে প্রক্রিয়া করার জন্য কোনও ফাংশন নেই The কলামগুলি কেবলমাত্র বাইরের মানচিত্রে প্রবেশ করেছে () যা এগুলিকে টিপলস থেকে তালিকায় রূপান্তর করে।

পাইথন 3-এ কোথাও, map()এই সমস্ত অপব্যবহারের বিষয়টি বন্ধ করে দেওয়া হয়েছে: প্রথম প্যারামিটারটি কোনওটিই হতে পারে না, এবং রাগযুক্ত পুনরাবৃত্তকারীগুলি কেবল সংক্ষিপ্ততমটিতে কাটা হয়। অন্যান্য পদ্ধতিগুলি এখনও কাজ করে কারণ এটি কেবল অভ্যন্তরীণ মানচিত্রে () প্রয়োগ হয়।


পদ্ধতি 4 - map()এর map()revisited

>>> list(map(list, map(lambda *args: args, *list_list)))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]   // Python 2.7
[[1, 4, 7], [2, 5, 8], [3, 6, 9], [None, 6.1, None], [None, 6.2, None], [None, 6.3, None]] // 3.6+

হায়রে রাগযুক্ত সারিগুলি পাইথন 3 এ রাগযুক্ত কলামগুলি পরিণত হয় না, সেগুলি কেবল ছাঁটা হয়েছে। বু হু অগ্রগতি।


7

তিনটি বিকল্প থেকে চয়ন করুন:

1. জিপ সহ মানচিত্র

solution1 = map(list, zip(*l))

২. তালিকা উপলব্ধি

solution2 = [list(i) for i in zip(*l)]

3. লুপ সংযোজন জন্য

solution3 = []
for i in zip(*l):
    solution3.append((list(i)))

এবং ফলাফলগুলি দেখতে:

print(*solution1)
print(*solution2)
print(*solution3)

# [1, 4, 7], [2, 5, 8], [3, 6, 9]

0

সম্ভবত সবচেয়ে মার্জিত সমাধান নয়, তবে লুপগুলি ব্যবহারের সময় নেস্টেড ব্যবহার করে একটি সমাধান এখানে দেওয়া হয়েছে:

def transpose(lst):
    newlist = []
    i = 0
    while i < len(lst):
        j = 0
        colvec = []
        while j < len(lst):
            colvec.append(lst[j][i])
            j = j + 1
        newlist.append(colvec)
        i = i + 1
    return newlist


0

more_itertools.unzip() পড়া সহজ, এবং এটি জেনারেটরগুলির সাথেও কাজ করে।

import more_itertools
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
r = more_itertools.unzip(l) # a tuple of generators.
r = list(map(list, r))      # a list of lists

বা সমতুল্য

import more_itertools
l = more_itertools.chunked(range(1,10), 3)
r = more_itertools.unzip(l) # a tuple of generators.
r = list(map(list, r))      # a list of lists

-1

প্রয়োজনীয় তালিকাটি বর্গক্ষেত্রের নয় এমন একটি তালিকা পরিবহনের জন্য এখানে একটি সমাধান রয়েছে:

maxCol = len(l[0])
for row in l:
    rowLength = len(row)
    if rowLength > maxCol:
        maxCol = rowLength
lTrans = []
for colIndex in range(maxCol):
    lTrans.append([])
    for row in l:
        if colIndex < len(row):
            lTrans[colIndex].append(row[colIndex])

-2
    #Import functions from library
    from numpy import size, array
    #Transpose a 2D list
    def transpose_list_2d(list_in_mat):
        list_out_mat = []
        array_in_mat = array(list_in_mat)
        array_out_mat = array_in_mat.T
        nb_lines = size(array_out_mat, 0)
        for i_line_out in range(0, nb_lines):
            array_out_line = array_out_mat[i_line_out]
            list_out_line = list(array_out_line)
            list_out_mat.append(list_out_line)
        return list_out_mat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.