পাইথন -৩.x এর অভিধান ব্যবহার করে আমি কীভাবে একটি স্ট্রিং ফর্ম্যাট করব?


215

আমি স্ট্রিংগুলিকে ফর্ম্যাট করতে ডিকশনারি ব্যবহারের একটি বড় ভক্ত। এটি আমাকে যে স্ট্রিং ফর্ম্যাটটি ব্যবহার করছি তা পড়ার পাশাপাশি বিদ্যমান অভিধানের সুবিধা নিতে আমাকে সহায়তা করে। উদাহরণ স্বরূপ:

class MyClass:
    def __init__(self):
        self.title = 'Title'

a = MyClass()
print 'The title is %(title)s' % a.__dict__

path = '/path/to/a/file'
print 'You put your file here: %(path)s' % locals()

তবে আমি এটি করার জন্য পাইথন 3.x সিনট্যাক্সটি বের করতে পারি না (বা এটি এমনকি সম্ভব হলে)। আমি নিম্নলিখিতটি করতে চাই

# Fails, KeyError 'latitude'
geopoint = {'latitude':41.123,'longitude':71.091}
print '{latitude} {longitude}'.format(geopoint)

# Succeeds
print '{latitude} {longitude}'.format(latitude=41.123,longitude=71.091)

উত্তর:


15

যেহেতু প্রশ্নটি পাইথন 3-এর সাথে সুনির্দিষ্ট, এখানে পাইথন ৩.6 থেকে পাওয়া নতুন এফ-স্ট্রিং সিনট্যাক্স ব্যবহার করা হয়েছে :

>>> geopoint = {'latitude':41.123,'longitude':71.091}
>>> print(f'{geopoint["latitude"]} {geopoint["longitude"]}')
41.123 71.091

বাইরের একক উদ্ধৃতি এবং অভ্যন্তরীণ ডাবল উদ্ধৃতিগুলি নোট করুন (আপনি এটি অন্যভাবেও করতে পারেন)।


আমি বলব যে এফ-স্ট্রিংয়ের ব্যবহার পাইথন 3 পদ্ধতির সাথে আরও সংযুক্ত করা হয়েছে।
জোনাটাস সিডি

2
মনে রাখবেন যে এফ-স্ট্রিংগুলি পাইথন ৩.6-এ নতুন, ৩.৫-এ নয়।
হুগো

409

এটা কি তোমার পক্ষে ভাল?

geopoint = {'latitude':41.123,'longitude':71.091}
print('{latitude} {longitude}'.format(**geopoint))

2
এটি চেষ্টা করেছিলাম এবং এটি কাজ করে। তবে আমি 'পয়েন্টার স্বরলিপি' ব্যবহার বুঝতে পারি না। আমি জানি পাইথন পয়েন্টার ব্যবহার করে না, এটি কি কোয়ার্গসের উদাহরণ?
হোমঙ্কুলাস রেটিকুলি

2
@ হোমঙ্কুলাস রেটিকুলি এটি একটি ফর্ম্যাট প্যারামিটার (ন্যূনতম ক্ষেত্র প্রস্থ), পয়েন্টার সি ++ স্টাইলের পয়েন্টার নয়। docs.python.org/release/2.4.4/lib/typesseq-strings.html
ডি রোসাদো

29
পাইথন 3.2 প্রবর্তিত format_mapএর মতো str.format(**mapping), এটি mappingসরাসরি ব্যবহার করা হয় এবং এ-তে অনুলিপি করা হয় dict। এটি দরকারী যদি উদাহরণস্বরূপ mappingএকটি ডিক সাবক্লাস হয়
ডায়াপির

1
@ ইউজিন ** অজগর অভিধানে কী করে? আমি মনে করি না যে এটি কোনও বস্তু তৈরি করেছে কারণ মুদ্রণ (** জিওপয়েন্ট) সিনট্যাক্স ত্রুটি দিতে ব্যর্থ হয়েছে
নিত্যেশ আগরওয়াল

4
@ নিতীশ আগরওয়াল এটি অভিধানটি পৃথক যুক্তি হিসাবে নাম = মান জোড়া দিয়ে ছড়িয়ে দেয় অর্থাত্ print(**geopoint)একই print(longitude=71.091, latitude=41.123)। অনেক ভাষায়, এটি স্প্লিট অপারেটর হিসাবে পরিচিত । জাভাস্ক্রিপ্টে একে স্প্রেড অপারেটর বলা হয় । পাইথনে, এই অপারেটরটির কোনও নির্দিষ্ট নাম দেওয়া হয়নি।
abhisekp

79

কীওয়ার্ড আর্গুমেন্টে একটি অভিধান আনপ্যাক করতে, ব্যবহার করুন **। এছাড়াও ,, নতুন স্টাইলের ফর্ম্যাটিং ম্যাপিংয়ের আইটেম এবং আইটেমের বৈশিষ্ট্যগুলি উল্লেখ করে:

'{0[latitude]} {0[longitude]}'.format(geopoint)
'The title is {0.title}s'.format(a) # the a from your first example

2
স্থানধারকের জন্য অবস্থানিক সূচক যুক্ত করার ফলে আমি এই উত্তরটি আরও ভাল দেখতে পাচ্ছি, কোডটি আরও স্পষ্ট এবং ব্যবহারে সহজ করে তোলে। বিশেষত যদি '{0[latitude]} {1[latitude]} {0[longitude]} {1[longitude]}'.format(geopoint0, geopoint1)
কারওর

1
আপনি যদি একটি ব্যবহার করেন defaultdictএবং সমস্ত কীগুলি না থাকে তবে এটি কার্যকর
কেন

65

পাইথন 3.0 এবং 3.1 EOL'ed হয় এবং কেউ এগুলি ব্যবহার করে না, আপনি ব্যবহার করতে পারেন এবং ব্যবহার করতে পারেন str.format_map(mapping)(পাইথন 3.2+):

অনুরূপ str.format(**mapping), বাদে ম্যাপিং সরাসরি ব্যবহৃত হয় এবং এ-তে অনুলিপি করা হয় নাdict । উদাহরণস্বরূপ ম্যাপিং একটি dictসাবক্লাস হয় তবে এটি কার্যকর।

এর অর্থ হ'ল আপনি উদাহরণস্বরূপ এমন একটি ব্যবহার করতে পারেন defaultdictযা অনুপস্থিত কীগুলির জন্য একটি ডিফল্ট মান সেট করে (এবং ফিরে) দেয়:

>>> from collections import defaultdict
>>> vals = defaultdict(lambda: '<unset>', {'bar': 'baz'})
>>> 'foo is {foo} and bar is {bar}'.format_map(vals)
'foo is <unset> and bar is baz'

প্রদত্ত ম্যাপিংটি যদি dictএকটি সাবক্লাস নয় তবে এটি সম্ভবত কিছুটা দ্রুত হবে।

পার্থক্যটি বড় নয়, দেওয়া হলেও

>>> d = dict(foo='x', bar='y', baz='z')

তারপর

>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format_map(d)

এর চেয়ে প্রায় 10 এনএস (2%) দ্রুত

>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format(**d)

আমার পাইথন 3.4.3 এ। পার্থক্য সম্ভবত আরও বড় হবে কারণ অভিধানে আরও কী রয়েছে এবং


নোট করুন যে বিন্যাসের ভাষা যদিও এর চেয়ে অনেক বেশি নমনীয়; এগুলিতে ইনডেক্সড এক্সপ্রেশন, অ্যাট্রিবিউট অ্যাক্সেস ইত্যাদি থাকতে পারে, যাতে আপনি একটি সম্পূর্ণ অবজেক্ট বা তার মধ্যে দুটি ফর্ম্যাট করতে পারেন :

>>> p1 = {'latitude':41.123,'longitude':71.091}
>>> p2 = {'latitude':56.456,'longitude':23.456}
>>> '{0[latitude]} {0[longitude]} - {1[latitude]} {1[longitude]}'.format(p1, p2)
'41.123 71.091 - 56.456 23.456'

৩.6 থেকে শুরু করে আপনি ইন্টারপোল্টেড স্ট্রিংগুলিও ব্যবহার করতে পারেন:

>>> f'lat:{p1["latitude"]} lng:{p1["longitude"]}'
'lat:41.123 lng:71.091'

নেস্টেড কোটগুলির মধ্যে আপনাকে অন্যান্য উদ্ধৃতি অক্ষরগুলি ব্যবহার করতে হবে কেবল মনে রাখতে হবে । এই পদ্ধতির আর একটি sideর্ধ্বমুখী হ'ল এটি কোনও ফর্ম্যাটিং পদ্ধতি কল করার চেয়ে অনেক দ্রুত


ভাল লাগল, কোনও পারফরম্যান্সের উন্নতি কি শেষ হয়েছে format? (প্রদত্ত যে এটি কোনও ডিক্টে অনুলিপি করা হয়নি)
ভার্গব রাও

2
@ ভরগাভরাও খুব বেশি নয়, ২%: ডি
আন্টি হাপাল

@ ভরগাভরাও যদি আপনি পারফরম্যান্সের সন্ধান করে থাকেন তবে এটি ব্যবহার করুন '%(latitude)s %(longitude)s'%geopoint;)
টিসিএল


6

পাইথন 2 সিনট্যাক্স পাইথন 3 তেও কাজ করে:

>>> class MyClass:
...     def __init__(self):
...         self.title = 'Title'
... 
>>> a = MyClass()
>>> print('The title is %(title)s' % a.__dict__)
The title is Title
>>> 
>>> path = '/path/to/a/file'
>>> print('You put your file here: %(path)s' % locals())
You put your file here: /path/to/a/file

প্লাস এটি f""বা "".format();) এর চেয়েও আরও পারফরম্যান্ট
Tcll

2
geopoint = {'latitude':41.123,'longitude':71.091}

# working examples.
print(f'{geopoint["latitude"]} {geopoint["longitude"]}') # from above answer
print('{geopoint[latitude]} {geopoint[longitude]}'.format(geopoint=geopoint)) # alternate for format method  (including dict name in string).
print('%(latitude)s %(longitude)s'%geopoint) # thanks @tcll

1
আপনি একটি মিস করেছেন;) print('%(latitude)s %(longitude)s'%geopoint)এটি অন্যান্য 2
টিসিএলএল

@tcll আসলে আমি উদাহরণগুলি চেয়েছিলাম, যেখানে আমি স্ট্রিংয়ের ভিতরে অভিধানের নামটি ব্যবহার করতে পারি। এরকম কিছু'%(geopoint["latitude"])s %(geopoint["longitude"])s'%{"geopoint":geopoint}
শেখ আবদুল ওয়াহিদ

1

সর্বাধিক উত্তরগুলি কেবল ডিকের মানগুলি ফর্ম্যাট করে।

আপনি যদি স্ট্রিংয়ের মধ্যে কীটি ফর্ম্যাট করতে চান তবে আপনি ডিক্টেমাইটস () ব্যবহার করতে পারেন :

geopoint = {'latitude':41.123,'longitude':71.091}
print("{} {}".format(*geopoint.items()))

আউটপুট:

('অক্ষাংশ', 41.123) ('দ্রাঘিমাংশ', 71.091)

আপনি যদি সালিসি পদ্ধতিতে ফর্ম্যাট করতে চান, তা হল টিপলসের মতো কী-মানগুলি না দেখানো:

from functools import reduce
print("{} is {} and {} is {}".format(*reduce((lambda x, y: x + y), [list(item) for item in geopoint.items()])))

আউটপুট:

অক্ষাংশ 41.123 এবং দ্রাঘিমাংশ 71.091 হয়


লক্ষ্য করুন যে 'দ্রাঘিমাংশ' থেকে 'অক্ষাংশের' আগে আসতে পারে geopoint.items();)
টিসিএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.