পাইথনের একটি অভিধানে একটি তালিকা রূপান্তর করুন


189

ধরা যাক আমার একটি তালিকা আছে a পাইথনে রয়েছে যার এন্ট্রিগুলি সুবিধামত একটি অভিধানে মানচিত্র করে। প্রতিটি এমনকি উপাদান অভিধানের মূলকে উপস্থাপন করে এবং নিম্নলিখিত বিজোড় উপাদানটির মান

উদাহরণ স্বরূপ,

a = ['hello','world','1','2']

এবং আমি এটি একটি অভিধানে রূপান্তর করতে চাই b, যেখানে

b['hello'] = 'world'
b['1'] = '2'

এটি সম্পাদন করার জন্য সিনট্যাক্টিক্যালি পরিষ্কার উপায় কী?


উত্তর:


269
b = dict(zip(a[::2], a[1::2]))

যদি aবড় হয় তবে আপনি সম্ভবত নীচের মতো কিছু করতে চাইবেন যা উপরের মতো কোনও অস্থায়ী তালিকা তৈরি করে না।

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

পাইথন 3-তে আপনি একটি ডিক বোঝাপড়াও ব্যবহার করতে পারেন, তবে হাস্যকরভাবে আমি মনে করি এটি করার সহজতম উপায়টি হবে range()এবং len()এটি সাধারণত একটি গন্ধযুক্ত।

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

সুতরাং iter()/izip()পদ্ধতিটি এখনও পাইথন 3 এর মধ্যে সম্ভবত সবচেয়ে পাইথোনিক, যদিও ইওএল একটি মন্তব্যে নোট হিসাবে zip()ইতিমধ্যে পাইথন 3 এ অলস, যাতে আপনার প্রয়োজন হয় না izip()

i = iter(a)
b = dict(zip(i, i))

আপনি যদি এটি এক লাইনে চান তবে আপনাকে প্রতারণা করতে হবে এবং একটি সেমিকোলন ব্যবহার করতে হবে। ;-)


9
… বা সহজভাবে zip(i, i), পাইথন 3 এ, যেহেতু zip()এখন একজন পুনরাবৃত্তি প্রদান করে।
এরিক হে লেবিগোট

5
দ্রষ্টব্য যে পাইথন ২.7.৩ এও ডিক বোঝাপড়া রয়েছে
ব্যবহারকারীর 1438003

56

সহজ উত্তর

আরেকটি বিকল্প ( অ্যালেক্স মার্টেলির সৌজন্যে - উত্স ):

dict(x[i:i+2] for i in range(0, len(x), 2))

সম্পর্কিত নোট

আপনার যদি এটি থাকে:

a = ['bi','double','duo','two']

এবং আপনি এটি চান (প্রদত্ত তালিকার প্রতিটি উপাদান একটি নির্দিষ্ট মানকে চাবি (এই ক্ষেত্রে 2)):

{'bi':2,'double':2,'duo':2,'two':2}

তুমি ব্যবহার করতে পার:

>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}

2
এটি কি পাইথন 3 এর জন্য?
তাগার

2
ব্যবহার fromkeys>>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
Gdogg

1
এটি প্রশ্নটি জিজ্ঞাসা করছে তার চেয়ে অন্য কিছু করছে।
Ozn

17

আপনি এটির জন্য খুব সহজেই একটি ডিক বোঝাপড়া ব্যবহার করতে পারেন:

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}

এটি নীচের লুপের সমতুল্য:

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]

10

এমন কিছু যা আমি বেশ শীতল মনে করি, এটি হ'ল যদি আপনার তালিকাটি কেবল 2 টি আইটেম দীর্ঘ হয়:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

মনে রাখবেন, ডিক একটি পুনরাবৃত্তীয় সমন্বিত যেকোন পুনরাবৃত্তিকে গ্রহণ করে যেখানে পুনরাবৃত্তের প্রতিটি আইটেম নিজেই অবশ্যই দুটি দুটি অবজেক্টের সাথে পুনরাবৃত্ত হতে হবে।


দ্রুত এবং সরল একটি, কেবল তালিকায় যুক্ত করতে যদি তালিকায় দুটিরও বেশি আইটেম থাকে তবে ডিক ([এলএস]) এর পরিবর্তে ডিক (এলএস) ব্যবহার করুন। উদাহরণস্বরূপ যদি ls = ['a', 'b', 'c', 'd'] তবে ডিক (ls)
অঙ্কিত ত্যাগী

1
ভাল লাগছে। 'পুনরাবৃত্তীয় প্রতিটি আইটেম নিজেই অবশ্যই দুটি দুটি বস্তুর সাথে পুনরাবৃত্ত হতে হবে।' এখানে মূল ঘটনা।
অভিজিৎ

4

সর্বাধিক পাইথোনিক নাও হতে পারে, তবে

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]

10
সম্পর্কে পড়ুনenumerate
সাইলেন্টগোস্ট

5
গণনা আপনাকে একটি পদক্ষেপের আকার নির্দিষ্ট করতে দেয় না, তবে আপনি ব্যবহার করতে পারেন for i, key in enumerate(a[::2]):। ডিক কনস্ট্রাক্টর আপনার জন্য এখানে বেশিরভাগ কাজ করতে পারে সেজন্য এখনও অবাস্তব
জন লা রুই

@ সাইলেন্টগোস্ট, গিনিবলার: আমার দিগন্তকে প্রশস্ত করার জন্য অনেক ধন্যবাদ! আমি ভবিষ্যতে এটি যথাসম্ভব অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হয়েছি!
সহম

@gnibbler: আপনি কীভাবে এই for i, key in enumerate(a[::2]):পদ্ধতির কাজ করতে পারেন সে সম্পর্কে আরও কিছু ব্যাখ্যা করতে পারেন? ফলাফলের জোড় মানগুলি হবে 0 helloএবং 1 1এগুলি উত্পাদন করতে কীভাবে ব্যবহার করা যায় তা আমার কাছে অস্পষ্ট {'hello':'world', '1':'2'}
মার্টিনিউ

1
@ মার্টিনেউ, আপনি ঠিক বলেছেন আমি মনে করি আমার অবশ্যই বোঝানো উচিত ছিলenumerate(a)[::2]
জন লা রুই

4

অতিরিক্ত অ্যারে তৈরি না করে আপনি এটি বেশ দ্রুত করতে পারেন, সুতরাং এটি খুব বড় অ্যারেগুলির জন্যও কাজ করবে:

dict(izip(*([iter(a)]*2)))

আপনার যদি জেনারেটর থাকে তবে aআরও ভাল:

dict(izip(*([a]*2)))

রুনডাউন এখানে:

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a tuple
dict()     #puts the tuples into key,value of the dictionary

এটি সমান কী এবং মান জোড়া ( {'hello':'hello','world':'world','1':'1','2':'2'})
মিক

না, সব কাজ ঠিক আছে। আরও সাবধানে পড়ুন দয়া করে। এটি বলে: "যদি আপনার কাছে জেনারেটর থাকে ..." আপনার যদি জেনারেটর না থাকে তবে কেবল প্রথম লাইনটি ব্যবহার করুন। দ্বিতীয়টি হ'ল একটি বিকল্প যা কার্যকর হতে পারে যদি আপনার তালিকার পরিবর্তে জেনারেটর থাকে তবে বেশিরভাগ সময় এটি ব্যবহার করতে পারে।
টোপকার

1

আপনি এটির মতো এটিও করতে পারেন (এখানে রূপান্তর তালিকার জন্য স্ট্রিং, তারপরে একটি অভিধানে রূপান্তর)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(zip(string_list[::2],string_list[1::2]))

    print string_list

1

আমি এই রূপান্তরটির জন্য ওয়ান-লাইনার পেতে খুব আগ্রহী, যতক্ষণ না এই জাতীয় তালিকা পার্লের হ্যাশের জন্য ডিফল্ট আরম্ভকারী।

এই থ্রেডে ব্যতিক্রমীভাবে ব্যাপক উত্তর দেওয়া হয়েছে -

পাইথন ২.7 জেনারেটর এক্সপ্রেশন ব্যবহার করে, আমার প্রথমটি পাইথনে আমি নবাগত be

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))


0

এটি অজগর কিনা তা আমি নিশ্চিত নই, তবে কাজ করছে বলে মনে হচ্ছে

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))


0

আপনি বিভিন্ন তালিকার কী এবং মানগুলি সংরক্ষণ করে এই পদ্ধতির চেষ্টা করতে পারেন এবং তারপরে ডিক পদ্ধতিটি ব্যবহার করতে পারেন

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

আউটপুট:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}

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