উত্তর:
কেমন
map(list, zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
অজগর জন্য 3.x ব্যবহারকারীরা ব্যবহার করতে পারেন
list(map(list, zip(*l)))
ব্যাখ্যা:
কী চলছে তা বুঝতে আমাদের দুটি বিষয় জানতে হবে:
zip(*iterables)
এর অর্থ zip
প্রতারণামূলক হতে হবে এমন প্রতিটি আর্গুমেন্টের স্বেচ্ছাসেবী সংখ্যার প্রত্যাশা। যেমন zip([1, 2], [3, 4], [5, 6])
।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])
। বাকিগুলি কেবল ফলাফলটি তালিকার তালিকার পরিবর্তে তালিকার একটি তালিকা কিনা তা নিশ্চিত করছে।
list(zip(*l))
পাইথন 3 এ এমনকি সঠিকভাবে কাজ করে
zip(*l)
পাইথন ২- তেও কাজ করে ) তবে আপনি তালিকার একটি তালিকা পাবেন, তালিকার একটি তালিকা নয়। অবশ্যই, list(list(it))
সর্বদা হিসাবে একই জিনিস list(it)
।
এটি করার একটি উপায় হ'ল নুমপি ট্রান্সপোজ। একটি তালিকার জন্য, একটি:
>>> 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]]
map
যে এটি করতে পারে। এখানে একটি সামান্য পরিশোধন রয়েছে যার জন্য 2 টি কল প্রয়োজন নেই, যদিও:map(lambda *a: list(a), *l)
map(None, ...)
পাই 3 এর জন্য কাজ করে না বলে মনে হচ্ছে। জেনারেটরের নির্মিত হয় কিন্তু next()
অবিলম্বে একটি ত্রুটি উত্থাপন: TypeError: 'NoneType' object is not callable
।
জেনার সমাধানের সাথে সমান:
>>> 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]]
map()
, পাইথন স্পিরিটে
কেবল মজাদার জন্য, বৈধ আয়তক্ষেত্রগুলি এবং ধরে নেওয়া যে এম [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]]
[[j[i] for j in l] for i in range(len(l[0]))]
। অবশ্যই, আপনাকে অবশ্যই নিশ্চিত হতে হবে যে তালিকাটি l
খালি নয়।
পাইথন 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]]
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()
হয়ে
itertools.izip_longest()
পাইথন 2 এitertools.zip_longest()
পাইথন 3 এডিফল্ট ফিলভ্যালু হয় None
। @ জেনার জবাবের জন্য ধন্যবাদ , যেখানে map()
অন্তর্নির্মিত তালিকাগুলিকে তালিকায় পরিবর্তন করা হচ্ছে। এখানে এটি পুনরাবৃত্তিকে তালিকায় পরিণত করছে। @ ওরেগানো এবং @ ব্যাপ্পের মন্তব্যে ধন্যবাদ ।
পাইথন 3 এ, list()
পদ্ধতি 2 হিসাবে একই 2D তালিকা পেতে ফলাফলটি পাস করুন ।
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, '-']]
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()
এই সমস্ত অপব্যবহারের বিষয়টি বন্ধ করে দেওয়া হয়েছে: প্রথম প্যারামিটারটি কোনওটিই হতে পারে না, এবং রাগযুক্ত পুনরাবৃত্তকারীগুলি কেবল সংক্ষিপ্ততমটিতে কাটা হয়। অন্যান্য পদ্ধতিগুলি এখনও কাজ করে কারণ এটি কেবল অভ্যন্তরীণ মানচিত্রে () প্রয়োগ হয়।
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 এ রাগযুক্ত কলামগুলি পরিণত হয় না, সেগুলি কেবল ছাঁটা হয়েছে। বু হু অগ্রগতি।
solution1 = map(list, zip(*l))
solution2 = [list(i) for i in zip(*l)]
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]
সম্ভবত সবচেয়ে মার্জিত সমাধান নয়, তবে লুপগুলি ব্যবহারের সময় নেস্টেড ব্যবহার করে একটি সমাধান এখানে দেওয়া হয়েছে:
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
import numpy as np
r = list(map(list, np.transpose(l)))
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
প্রয়োজনীয় তালিকাটি বর্গক্ষেত্রের নয় এমন একটি তালিকা পরিবহনের জন্য এখানে একটি সমাধান রয়েছে:
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])
#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
l
সমান আকারের না হয় (বলুন, কিছু সারি অন্যের তুলনায় ছোট) তবে এর জন্য ক্ষতিপূরণ দেওয়াzip
হবে না এবং পরিবর্তে আউটপুট থেকে সারিগুলি কেটে দেওয়া হবে । তাইl=[[1,2],[3,4],[5]]
আপনাকে দেয়[[1,3,5]]
।