প্রদত্ত সূচকে উপাদানটির দ্বারা তালিকাগুলির তালিকাগুলি / টিপলগুলি কীভাবে সাজানো যায়?


657

তালিকার তালিকায় বা টিপলগুলির তালিকায় আমার কিছু ডেটা রয়েছে, এর মতো:

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

এবং আমি সাবসেটে 2 য় উপাদান অনুসারে বাছাই করতে চাই। , যার অর্থ 2,5,8 যেখানে দ্বারা বাছাই 2থেকে (1,2,3), 5থেকে (4,5,6)। এটি করার সাধারণ উপায় কী? আমার তালিকায় আমার টিউপস বা তালিকা রাখা উচিত?


51
"আমার তালিকায় কি টিপলস বা তালিকাগুলি সংরক্ষণ করা উচিত?" সম্পর্কিত, থাম্বের একটি নিয়ম জিনিসকে যতটা সম্ভব অপরিবর্তনীয় করে তোলা। যদি আপনার জায়গায় সাবলিস্টগুলি সংশোধন করার প্রয়োজন না হয় তবে সেগুলি দুটি করে নিন।
ম্যাথু ফ্ল্যাশেন

উত্তর:


1112
sorted_by_second = sorted(data, key=lambda tup: tup[1])

বা:

data.sort(key=lambda tup: tup[1])  # sorts in place

10
এটিকে আরও ছোট থেকে কীভাবে সাজানো যায় কোনও ধারণা?
বিলওয়াল্ড

63
@ বিলুইল্ড: সহায়তা (সাজানো) বিপরীত = true।
স্টিফেন

34
@ স্টেফেন আইটেমজিটার ব্যবহার করে দ্রুত এবং সহজ: key=itemgetter(1)এবং ফাইলের শুরুতে:from operator import itemgetter
জোসচুয়া

3
@ দ্বিতীয় উদাহরণ হিসাবে চেমেরি sortএখানে Listপাইথন অবজেক্টের একটি পদ্ধতি রয়েছে যা ল্যাম্বডা ফাংশনটিকে তার keyপরামিতি হিসাবে গ্রহণ করে । আপনি এটা যেমন নাম পারে tup, অথবা t, অথবা যাই হোক না কেন আপনার মত এবং এটি এখনও কাজ করব। tupএখানে তালিকার টিপলটির সূচক উল্লেখ করা হয়েছে, সুতরাং এর 1অর্থ আসল তালিকা থেকে টিপলসের দ্বিতীয় মান দ্বারা বাছাই করা হবে ( 2, 5, 8)।
নিউরোট্রান্সমিটার

1
আমি অসমর্থিত দাবির প্রতি হালকাভাবে সন্দেহবাদী ছিলাম যে "আইটেমজিটার ব্যবহার করা দ্রুত এবং সহজ।" আমি স্বজ্ঞাত বিবেচনা subjectively যদিও lambdaপদ্ধতির unintuitive চেয়ে সহজ হতে itemgetterবর্গ, itemgetter নেই প্রকৃতপক্ষে দ্রুত বলে মনে । আমি কেন আগ্রহী তা জানতে আগ্রহী। আমার অপরিশোধিত সন্দেহটি হ'ল এটি একটি lambdaসমস্ত স্থানীয় ভেরিয়েবলগুলি বন্ধের প্রসঙ্গে ক্যাপচার করার জন্য লুকানো ব্যয় বহন করে, যেখানে কোনও itemgetterউদাহরণ নেই। tl; dr: সর্বদা ব্যবহার করুন itemgetter, কারণ গতি জয়ী।
সিসিল কারি

236
from operator import itemgetter
data.sort(key=itemgetter(1))

37
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আরও দেখুন চার্লি 'র পোস্ট সময় , প্রদর্শক itemgetterসাজাতে বর্গ 126% দ্রুত সমতুল্য চেয়ে গড়ে lambdaফাংশন।
সিসিল কারি

9
আপনি একাধিক সূচকে শ্রেণিবিন্যাস অনুসারে বাছাই করতে পারেন, উদাহরণস্বরূপdata.sort(key=itemgetter(3,1))
মাইকেল অহল্রোগ

57

আমি যদি স্টিফেনের জবাবটি যুক্ত করতে চাই তবে আপনি যদি অ্যারেটি উচ্চ থেকে নিম্নে বাছাই করতে চান তবে উপরের মন্তব্যে ব্যতীত অন্য কোনও উপায় হ'ল লাইনে যুক্ত করুন:

reverse = True

এবং ফলাফল নিম্নলিখিত হবে:

data.sort(key=lambda tup: tup[1], reverse=True)

48

একাধিক মাপদণ্ড অনুসারে বাছাই করার জন্য, উদাহরণস্বরূপ একটি টিপলে দ্বিতীয় এবং তৃতীয় উপাদানগুলির দ্বারা, আসুন

data = [(1,2,3),(1,2,1),(1,1,4)]

এবং সুতরাং একটি ল্যাম্বডাকে সংজ্ঞায়িত করুন যা উদাহরণস্বরূপ, অগ্রাধিকার বর্ণনা করে এমন একটি টুপল ফেরত দেয়

sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]

28

স্টিফেনের উত্তরটি আমি ব্যবহার করেছি। সম্পূর্ণতার জন্য, তালিকার বোধগম্যতার সাথে ডিএসইউ (সাজসজ্জা-সাজানো-আনকোরেক্ট) প্যাটার্নটি এখানে রয়েছে:

decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]

বা, আরও নিখুঁত:

[b for a,b in sorted((tup[1], tup) for tup in data)]

পাইথন বাছাইয়ের হাওটোতে যেমন উল্লেখ করা হয়েছে, মূল ফাংশনগুলি উপলভ্য হওয়ার পরে পাইথন ২.৪ থেকে এটি অপ্রয়োজনীয়।


2
তাহলে এই উত্তরটি পাইথন ২.৩- এর জন্য কার্যকর? আরও প্রায় বর্তমান পাইথন সংস্করণগুলির এমন কোনও বৈধ ব্যবহার রয়েছে যার আশেপাশে আপনি কিছুটা বিস্তৃত করতে পারেন? যদি তা না হয়, কোনও মাথা ঘামায় না ... কেবল পাশ দিয়ে যাচ্ছিল, এটি দেখে এবং পুরানো নোগিনটি কেবলমাত্র একটি দেরিতে মন্থন করতে লাগল। যাইহোক, পাইথনের আগের দিনগুলিতে ফিরে আসার জন্য চিয়ার্স এবং ধন্যবাদ।
যান্ত্রিক_মেট

19

ক্রমবর্ধমান ক্রম এবং বর্ণমালা অনুসারে (<word>, <count>), টিউপসগুলির একটি তালিকা বাছাই করার জন্য:countword

data = [
('betty', 1),
('bought', 1),
('a', 1),
('bit', 1),
('of', 1),
('butter', 2),
('but', 1),
('the', 1),
('was', 1),
('bitter', 1)]

আমি এই পদ্ধতিটি ব্যবহার করি:

sorted(data, key=lambda tup:(-tup[1], tup[0]))

এবং এটি আমাকে ফলাফল দেয়:

[('butter', 2),
('a', 1),
('betty', 1),
('bit', 1),
('bitter', 1),
('bought', 1),
('but', 1),
('of', 1),
('the', 1),
('was', 1)]

1
tup [1] যদি একটি স্ট্রিং হয়?
এরিক

12

ল্যাম্বদা ছাড়া:

def sec_elem(s):
    return s[1]

sorted(data, key=sec_elem)

9

itemgetter()এর তুলনায় কিছুটা দ্রুত lambda tup: tup[1], তবে বৃদ্ধি তুলনামূলকভাবে পরিমিত (প্রায় 10 থেকে 25 শতাংশ)।

(আইপিথন সেশন)

>>> from operator import itemgetter
>>> from numpy.random import randint
>>> values = randint(0, 9, 30000).reshape((10000,3))
>>> tpls = [tuple(values[i,:]) for i in range(len(values))]

>>> tpls[:5]    # display sample from list
[(1, 0, 0), 
 (8, 5, 5), 
 (5, 4, 0), 
 (5, 7, 7), 
 (4, 2, 1)]

>>> sorted(tpls[:5], key=itemgetter(1))    # example sort
[(1, 0, 0), 
 (4, 2, 1), 
 (5, 4, 0), 
 (8, 5, 5), 
 (5, 7, 7)]

>>> %timeit sorted(tpls, key=itemgetter(1))
100 loops, best of 3: 4.89 ms per loop

>>> %timeit sorted(tpls, key=lambda tup: tup[1])
100 loops, best of 3: 6.39 ms per loop

>>> %timeit sorted(tpls, key=(itemgetter(1,0)))
100 loops, best of 3: 16.1 ms per loop

>>> %timeit sorted(tpls, key=lambda tup: (tup[1], tup[0]))
100 loops, best of 3: 17.1 ms per loop

দয়া করে এখানে একাধিক কলামের জন্য বিপরীত যুক্তিগুলির জন্য আইটেমটেটার বাছাইয়ের সমাধানটি দেখুন, তারপরে আপনাকে পরপর একাধিক পদক্ষেপে আপনার বাছাইয়ের ব্যবস্থা করতে হবে: stackoverflow.com/questions/14466068/…
লরেঞ্জ

6

@ স্টিফেনের উত্তরটি মূল বিষয়! এখানে আরও ভাল দৃশ্যধারণের জন্য একটি উদাহরণ রয়েছে,

প্রস্তুত প্লেয়ার ওয়ান ভক্তদের জন্য চিৎকার করুন! =)

>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')]
>>> gunters.sort(key=lambda tup: tup[0])
>>> print gunters
[('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]

keyএটি এমন একটি ফাংশন যা তুলনার জন্য সংগ্রহের আইটেমগুলিকে রূপান্তর করতে বলা হবে .. compareToজাভা হিসাবে পদ্ধতি হিসাবে।

কীতে পৌঁছে যাওয়া প্যারামিটারটি অবশ্যই কলযোগ্য be এখানে, ব্যবহার lambdaএকটি বেনামে ফাংশন তৈরি করে (যা কলযোগ্য)।
ল্যাম্বদা সিনট্যাক্স হ'ল ল্যাম্বদা শব্দটির পরে একটি পুনরাবৃত্ত নাম এবং তারপরে কোডের একক ব্লক।

উদাহরণস্বরূপ, আমরা টুপলের একটি তালিকা বাছাই করছি যা নির্দিষ্ট ইভেন্ট এবং অভিনেতার নাম সম্পর্কিত তথ্য সময়কে ধারণ করে।

ইভেন্ট সংঘটিত হওয়ার সময় অনুসারে আমরা এই তালিকাটি বাছাই করছি - যা একটি টিউপলের 0 তম উপাদান।

দ্রষ্টব্য - s.sort([cmp[, key[, reverse]]]) স্থানে গুলি এর আইটেম বাছাই


-5

একটি টিপল বাছাই করা বেশ সহজ:

tuple(sorted(t))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.