আমি কীভাবে একটি তালিকা পুনরায় অর্ডার করতে পারি? [বন্ধ]


107

আমার যদি একটি তালিকা থাকে তবে আমি [a,b,c,d,e]কীভাবে পছন্দসই পদ্ধতিতে আইটেমগুলি পুনঃক্রম করতে পারি [d,c,a,b,e]?

সম্পাদনা: আমি এগুলি বদলাতে চাই না। আমি তাদের পূর্বনির্ধারিত পদ্ধতিতে পুনরায় অর্ডার করতে চাই। (উদাহরণস্বরূপ, আমি জানি যে পুরানো তালিকার তৃতীয় উপাদানটি নতুন তালিকার প্রথম উপাদান হওয়া উচিত)


সম্ভবত এর প্রতিলিপি stackoverflow.com/questions/976882/...
kgiannakakis

4
আপনি কীভাবে আইটেমগুলিকে এর শক্ত উত্তর দিতে চান তা নির্দিষ্ট করে না দিয়ে। আপনি কি তাদের বাছাই করতে চান? এলোমেলো? তাদের কিছু সরান?
মিজিপজোর

@ ট্যানফেসন: এক্ষেত্রে স্বেচ্ছাচারিতার অর্থও হতে পারে: একটি স্বেচ্ছাসেবক (তবে ভাল সংজ্ঞায়িত) সাজানোর ক্রিয়াটি গ্রহণ করুন।
ফেলিক্স ক্লিং

1
@ মিজিপজোর আমি পূর্বনির্ধারিত উপায়ে তাদের পুনরায় অর্ডার করতে চাই। (এটি পরিষ্কার করার জন্য প্রশ্নটি সম্পাদনা করা হয়েছে)
নিয়াস

@ সাইলেন্টগোস্ট এটির একটি নতুন সূচক থাকবে। 4 হতে পারে। বিষয়টি হ'ল আমি আইটেমগুলির নতুন ক্রমটি জানি।
নিয়াজ

উত্তর:


226

আপনি এটি এইভাবে করতে পারেন

mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = [mylist[i] for i in myorder]
print(mylist)         # prints: ['d', 'c', 'a', 'b', 'e']

এটি একটি নতুন ভেরিয়েবল তৈরি করে। জায়গায় জায়গায় কোনও তালিকা পুনরায় অর্ডার করবেন কীভাবে? ধন্যবাদ
হতবুদ্ধি

@ চূড়ান্তভাবে চূড়ান্ত লাইনটি এতে পরিবর্তন করুন:mylist[:] = [mylist[i] for i in myorder]
অ্যাডাম


11
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]

@ wenlibin02, এটি কেবল 2.7.5 এর নিচে চালিয়েছে এবং এটি এখনও ঠিক কাজ করে। আপনি কিছু ধরণের ত্রুটি পেতে পারি?
চিহ্নিত করুন

কোনও ত্রুটি নেই, আমি কেবল টাইপ করি: 1) র্যান্ডম আমদানি করুন; x = [1, 2, 3]; (x) এর random.shuffle; # এটি কেউই রিটার্ন দেয় না; এবং 2) আমি np.random.shuffle চেষ্টা করেছি। ফলাফল একই।
Libin Wen

ওহ দুঃখিত! আমি বুঝতে পারিনি যে আমি সরাসরি এক্স এর মান পরিবর্তন করেছি। এটি কিছুই ফেরেনি। এবং এটি কাজ করে। ধন্যবাদ।
লিবিন ওয়েন

6

চূড়ান্ত আদেশ সূচকগুলির একটি তালিকা দ্বারা সংজ্ঞায়িত করা হয়?

>>> items = [1, None, "chicken", int]
>>> order = [3, 0, 1, 2]

>>> ordered_list = [items[i] for i in order]
>>> ordered_list
[<type 'int'>, 1, None, 'chicken']

সম্পাদনা: মেহ। এজে দ্রুত ছিল ... আমি কীভাবে অজগরটিতে একটি তালিকা পুনরায় অর্ডার করতে পারি?



2

আপনি নিজের ধরণের ক্রিয়াকলাপটি এটিকে সরবরাহ করতে পারেন list.sort():

তুলনা নিয়ন্ত্রণ করার জন্য বাছাই () পদ্ধতিটি alচ্ছিক যুক্তি গ্রহণ করে।

  • CMP নির্দিষ্ট করে দুটি আর্গুমেন্ট (তালিকা আইটেম) যা নেতিবাচক, শূন্য বা ধনাত্মক সংখ্যা প্রথম আর্গুমেন্ট চেয়ে ছোট বলে মনে করা হয় কিনা তার উপর নির্ভর করে আসতে, এর সমান হবে, বা দ্বিতীয় যুক্তি চেয়ে বড় একটি কাস্টম তুলনা ফাংশন: cmp=lambda x,y: cmp(x.lower(), y.lower())। ডিফল্ট মান None

  • কী তা নির্দিষ্ট একটি আর্গুমেন্ট একটি ফাংশন প্রতিটি তালিকা উপাদান থেকে একটি তুলনা কী বের করে আনতে ব্যবহার করা হয়: key=str.lower। ডিফল্ট মান None

  • বিপরীত একটি বুলিয়ান মান। যদি সত্য হিসাবে সেট করা থাকে, তারপরে তালিকার উপাদানগুলি সাজানো হয় যেন প্রতিটি তুলনা বিপরীত হয়।

সাধারণভাবে, কী এবং বিপরীত রূপান্তর প্রক্রিয়াগুলি একটি সমমানের সিএমপি ফাংশন নির্দিষ্ট করার চেয়ে অনেক দ্রুত হয়। এটি কারণ প্রতিটি সিপি এলিমেন্টের জন্য সিএমপিকে একাধিকবার ডাকা হয় যখন কী এবং বিপরীত প্রতিটি উপাদান একবারে একবার স্পর্শ করে।


2
এবং আপনি কীভাবে এটি বাস্তবায়ন করবেন?
সাইলেন্টগোস্ট

@ সাইলেন্টগোস্ট: এটি সাধারণ উত্তর হিসাবে বোঝানো হয়েছে। ওপিএস ক্ষেত্রে আপনার উত্তরটি আরও উপযুক্ত। তবুও আমি মনে করি যে জেনেরিক সমাধান বিদ্যমান তা জানা গুরুত্বপূর্ণ is
ফেলিক্স ক্লিং

2

আপনি যদি নাম্পি ব্যবহার করেন তবে এটি করার একটি পরিষ্কার উপায় রয়েছে:

items = np.array(["a","b","c","d"])
indices = np.arange(items.shape[0])
np.random.shuffle(indices)
print(indices)
print(items[indices])

এই কোডটি ফেরত:

[1 3 2 0]
['b' 'd' 'c' 'a']

1
ওপি একটি সাধারণ পুনর্নির্মাণের সন্ধান করছে, জেনেরিক বদলানো নয়।
তিপিম্ম

2

আপনি যদি দক্ষতার বিষয়ে এতটা চিন্তা না করেন তবে এটিকে মার্জিত করে তুলতে আপনি নম্পির অ্যারে সূচকের উপর নির্ভর করতে পারেন:

a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )

1

আমি আপনার প্রশ্নটি যা বুঝতে পারি তা থেকে এটি প্রদর্শিত হয় যে আপনি কোনও ক্রমটি প্রয়োগ করতে চান যা আপনি একটিতে নির্দিষ্ট করেছেন list। এটি অন্য নির্দিষ্ট করে list(এটি কল করতে দেয় p) নির্দিষ্ট করে দেওয়া হয় যা মূল উপাদানগুলির সূচকগুলিকে ধারণ করে listযা অনুমতিপ্রাপ্ত হওয়া উচিত list। আপনি তারপরে যার অবস্থানের সূচকটি সেই অবস্থানে রয়েছে তার দ্বারা প্রতিটি অবস্থানে কেবল উপাদানটি প্রতিস্থাপন করে pএকটি নতুন তৈরি করতে ব্যবহার করুন ।listp

def apply_permutation(lst, p):
    return [lst[x] for x in p]

arr=list("abcde")
new_order=[3,2,0,1,4]

print apply_permutation(arr,new_order)

এই মুদ্রণ ['d', 'c', 'a', 'b', 'e']

এটি প্রকৃতপক্ষে একটি নতুন তৈরি করে list, তবে মূলটিকে "জায়গায়" রাখার জন্য এটি তুচ্ছভাবে সংশোধন করা যেতে পারে।


1

আরও একটি বিষয় যা বিবেচনা করা যেতে পারে তা হ'ল অন্ধকার দ্বারা নির্দেশিত অন্য ব্যাখ্যা

পাইথনে কোড ২.7

প্রধানত:

  1. মান অনুসারে পুনঃক্রম করুন - ইতিমধ্যে উপরে এজে দ্বারা সমাধান করা হয়েছে
  2. সূচকের মাধ্যমে পুনঃক্রম করুন

    mylist = ['a', 'b', 'c', 'd', 'e']
    myorder = [3, 2, 0, 1, 4]
    
    mylist = sorted(zip(mylist, myorder), key=lambda x: x[1])
    print [item[0] for item in mylist]

এটি ['সি', 'ডি', 'বি', 'এ', 'ই'] প্রিন্ট করবে



-1

আমি যখন এই সমস্যায় হোঁচট খেয়েছিলাম তখনই আমি এটি ব্যবহার করি।

def order(list_item, i): # reorder at index i
    order_at = list_item.index(i)
    ordered_list = list_item[order_at:] + list_item[:order_at]
    return ordered_list

EX: ছোট হাতের অক্ষরের জন্য

order(string.ascii_lowercase, 'h'):
>>> 'hijklmnopqrstuvwxyzabcdefg'

এটি কেবলমাত্র তালিকাটিকে একটি নির্দিষ্ট সূচীতে স্থানান্তরিত করে

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