পাইথন তালিকার একটি অভিধান তৈরি করছে


214

আমি একটি অভিধান তৈরি করতে চাই যার মান তালিকা। উদাহরণ স্বরূপ:

{
  1: ['1'],
  2: ['1','2'],
  3: ['2']
}

যদি আমি করি:

d = dict()
a = ['1', '2']
for i in a:
    for j in range(int(i), int(i) + 2): 
        d[j].append(i)

আমি একটি কী-এরর পেয়েছি, কারণ ডি [...] তালিকা নয়। এই ক্ষেত্রে, আমি অভিধানটি আরম্ভ করার জন্য একটি নিয়োগের পরে নিম্নলিখিত কোডটি যুক্ত করতে পারি।

for x in range(1, 4):
    d[x] = list()

এই কাজ করতে একটি ভাল উপায় আছে কি? আসুন বলুন যে আমি দ্বিতীয় forলুপটিতে না আসা পর্যন্ত আমার যে কীগুলি দরকার তা আমি জানি না । উদাহরণ স্বরূপ:

class relation:
    scope_list = list()
...
d = dict()
for relation in relation_list:
    for scope_item in relation.scope_list:
        d[scope_item].append(relation)

একটি বিকল্প তারপরে প্রতিস্থাপন করা হবে

d[scope_item].append(relation)

সঙ্গে

if d.has_key(scope_item):
    d[scope_item].append(relation)
else:
    d[scope_item] = [relation,]

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

উত্তর:


278

আপনি ডিফল্টডিক্ট ব্যবহার করতে পারেন :

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> a = ['1', '2']
>>> for i in a:
...   for j in range(int(i), int(i) + 2):
...     d[j].append(i)
...
>>> d
defaultdict(<type 'list'>, {1: ['1'], 2: ['1', '2'], 3: ['2']})
>>> d.items()
[(1, ['1']), (2, ['1', '2']), (3, ['2'])]

1
অধীনে অন্য অভিধান collectionsমডিউল এছাড়াও উদাহরণস্বরূপ এই ভাবে কাজ করে, collections.OrderedDict
txsaw1

2
উহু. এটা অসাধারণ. এবং আপনাকে '= []' এ আরম্ভ করতে হবে না। ভাল জিনিস!
উইলমার ই হেনাও

1
NameError: name 'a' is not defined
এস অ্যান্ড্রু

51

আপনি এটির মতো তালিকা বোঝার সাথে এটি তৈরি করতে পারেন:

>>> dict((i, range(int(i), int(i) + 2)) for i in ['1', '2'])
{'1': [1, 2], '2': [2, 3]}

এবং আপনার প্রশ্নের দ্বিতীয় অংশের জন্য ডিফল্টডিক্ট্ট ব্যবহার করুন

>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
        d[k].append(v)

>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

32

আপনি ব্যবহার করতে পারেন setdefault:

d = dict()
a = ['1', '2']
for i in a:
    for j in range(int(i), int(i) + 2): 
        d.setdefault(j, []).append(i)

print d  # prints {1: ['1'], 2: ['1', '2'], 3: ['2']}

বরং অদ্ভুত-নামযুক্ত setdefaultফাংশনটি বলে "এই কীটি দিয়ে মানটি পান, বা যদি সেই কীটি না থাকে তবে এই মানটি যুক্ত করুন এবং তারপরে এটি ফিরিয়ে দিন।

অন্যরা যেমন যথাযথভাবে উল্লেখ করেছে, defaultdictএটি একটি ভাল এবং আরও আধুনিক পছন্দ। setdefaultপাইথনের পুরানো সংস্করণগুলিতে এখনও দরকারী (2.5 এর আগে)।


2
এটি কাজ করে, তবে এটি উপলভ্য হলে সাধারণত ডিফল্টডিক্ট ব্যবহার করা পছন্দ হয়।
ডেভিড জেড

@ ডেভিড, হ্যাঁ, সেটডাফল্ট ডিজাইনের সর্বাধিক উজ্জ্বল বিট ছিল না, দুঃখিত - এটি সম্ভবত সবচেয়ে ভাল পছন্দ। আমি মনে করি আমরা (পাইথন প্রতিশ্রুতিবদ্ধ) সংগ্রহগুলি.ডিফাল্টিক্টিক্ট, যদিও ;-) সহ আমাদের সম্মিলিত খ্যাতি খালাস করেছি।
অ্যালেক্স মার্টেলি

@ ডেভিডজেড, সেটডিফল্ট ডিফল্টডিক্ট্ট থেকে আলাদা, কারণ এটি আরও নমনীয়: অন্যভাবে, আপনি কীভাবে বিভিন্ন অভিধান কীগুলির জন্য আলাদা ডিফল্ট মান নির্দিষ্ট করেন?
অ্যালেক্স গিদান

@ অ্যালেক্সজিদান এটি সত্য, তবে এই প্রশ্নের সাথে বিশেষ প্রাসঙ্গিক নয়।
ডেভিড জেড

আপনার যখন অর্ডারডিক্ট এবং একটি ডিফল্ট মান প্রয়োজন হয় তখন এই উত্তরটিও কার্যকর।
নিমক্যাপ

2

আপনার প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে, তবে আইআইআরসি আপনি লাইনগুলি প্রতিস্থাপন করতে পারেন:

if d.has_key(scope_item):

সঙ্গে:

if scope_item in d:

অর্থাত্ সেই নির্মাণে dউল্লেখ d.keys()। কখনও কখনও defaultdictসেরা বিকল্প হয় না (উদাহরণস্বরূপ, যদি আপনি elseউপরের সাথে সম্পর্কিত হওয়ার পরে কোডের একাধিক লাইন সম্পাদন করতে চান if) এবং আমি inবাক্য গঠনটি আরও সহজভাবে খুঁজে পাই ।


2

ব্যক্তিগতভাবে, আমি জিনিসগুলি স্ট্রিং এবং পিছনে রূপান্তর করতে কেবল JSON ব্যবহার করি। স্ট্রিংগুলি আমি বুঝতে পারি।

import json
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
mydict = {}
hash = json.dumps(s)
mydict[hash] = "whatever"
print mydict
#{'[["yellow", 1], ["blue", 2], ["yellow", 3], ["blue", 4], ["red", 1]]': 'whatever'}

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