পাইথন: খালি স্ট্রিংয়ে কাউকে রূপান্তর করার সবচেয়ে মূর্তিমান পদ্ধতি?


156

নিম্নলিখিতটি করার সর্বাধিক অভিহিত পদ্ধতি কী?

def xstr(s):
    if s is None:
        return ''
    else:
        return s

s = xstr(a) + xstr(b)

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

def xstr(s):
    if s is None:
        return ''
    else:
        return str(s)

7
আমি আপনার মূল বাক্য গঠন পছন্দ করি। আমি মনে করি এটি ইতিমধ্যে বেশ স্পষ্ট এবং পড়তে সহজ।
গুইসিম

1
@ গুইসিম: আমি হয়তো পক্ষপাতদুষ্ট, তবে আমার উত্তরটি প্রায় একটি সাধারণ ইংরেজী বাক্যের মতো পড়ছে ...
সাইলেন্টগোস্ট

1
"যদি এসটি না হয় তবে একটি খালি স্ট্রিং ফিরিয়ে দিন; অন্যথায়, [টিয়ের স্ট্রিং] ফিরিয়ে দিন" " প্রশ্ন থেকে কোডটিও একটি সাধারণ ইংরেজি বাক্যটির মতো পড়ে।

ক) যদি স্ট্রিংটি sডিক অনুসন্ধান থেকে আসে যেখানে কীটি পাওয়া যায় নি, তবে ব্যবহার করুনdict.get(key, '')
স্মি

খ) আপনি যদি কেবল আউটপুট ফর্ম্যাটিংয়ের জন্য এই স্ট্রিং-রূপান্তর চান (যেমন মুদ্রণের জন্য), তবে আপনি সরাসরি '... {।'। ফর্ম্যাট করতে পারেন (ডিক্টেজেট (1)) `
স্মি

উত্তর:


94

আপনি যদি নিজের ফাংশনটি str()অন্তর্নির্মিতের মতো আচরণ করতে চান তবে যুক্তিটি কোনওটি না হলে খালি স্ট্রিংটি ফিরিয়ে দিন:

def xstr(s):
    if s is None:
        return ''
    return str(s)

আমি অন্যটি রাখছি, তবে স্ট্র (টি) টিপটির জন্য ধন্যবাদ যাতে একাধিক প্রকার পরিচালনা করা যায়। চমৎকার!
মার্ক হ্যারিসন

11
বা সহজভাবেxstr = lambda s: '' if s is None else str(s)
মাইকেল মায়ার

2
আমি if not s:পরিবর্তে টাইপ করতে পছন্দ করিif s is None
guneysus

6
@ গুনিয়াসস তারা এক নয়: not False == Trueতবে False is None == False
লিন

ধন্যবাদ @ লিন আপনি ঠিক বলেছেন। আমি আমার দোষ বুঝতে পেরেছি। তবে আমি জানি (বা ধরে নেওয়া) sসর্বদা একটি স্ট্র / ইউনিকোড টাইপ বা None। হ্যাঁ, Falseএকটি মান তবে আমি এই
পদ্ধতিটি

143
def xstr(s):
    return '' if s is None else str(s)

3
এই বাক্য গঠনটি 2.5 সালে চালু হয়েছিল; পাইথনের পূর্ববর্তী সংস্করণগুলির জন্য, আপনি ব্যবহার করতে পারেন return s is not None and s or ''
বেন ফাঁকা

8
আমি আরও কমমানের মামলায় জোর দেওয়ার জন্য এটি ঘুরিয়ে দেব: এস যদি অন্য কেউ না হয় তবে ফিরে আসি ""
বের

5
@ বার: ডাবল নেগেটিভ এড়াতে আমি এটিকে ঠিক তেমন রাখব।
নিখিল চেলিয়াহ

8
এটি কীভাবে .. and .. or ..ব্যর্থ হয় এবং কেন অন্যথায় অগ্রাধিকার দেওয়া হয় তার একটি ভাল উদাহরণ । এখানে দুটি সূক্ষ্ম বাগ রয়েছে s is not None and s or ''

1
return '' if not s else str(s)
ইকবাল

107

সম্ভবত সবচেয়ে ছোট হবে str(s or '')

কারণ কোনওটি মিথ্যা নয়, এবং x মিথ্যা হলে "x বা y" y প্রদান করে। বিস্তারিত ব্যাখ্যা করার জন্য বুলিয়ান অপারেটরগুলি দেখুন । এটি সংক্ষিপ্ত, তবে খুব স্পষ্ট নয়।


1
এটি এত দুর্দান্ত, আপনাকে ধন্যবাদ! কখনও orএইভাবে ব্যবহার করার কথা
ভাবেননি

15
s0, মিথ্যা বা কোনও মিথ্যা মান হলে এটি কাজ করে না
উইসবাকী

4
ঠিক আছে, অপের প্রয়োজনীয়তার সাথে এটি উল্লেখ করা হয়নি, সুতরাং আমি এখানে আপনার পয়েন্টটি দেখছি না।
ডোরভাক

2
@dorvak ওপি প্রয়োজন যে আউটপুট হওয়া উচিত বেশ স্পষ্ট হয় ''iff s is None। অন্যান্য সমস্ত ইনপুট ফিরে আসতে হবে s(বা str(s)সংশোধিত অনুরোধে)।
StvnW

2
@ ফোর্তিয়া: কাজ করবে না যদি sহয় None, ফলে xstr()একটি খালি স্ট্রিং হওয়া উচিত, কিন্তু str(None)স্ট্রিং দেয় "None", যা কি ফিরিয়ে দেওয়া হয় (যেহেতু স্ট্রিং "None"একটি falsy মান নয়।
dreamlax

97

যদি আপনি জানেন যে মানটি সর্বদা হয় একটি স্ট্রিং বা কোনও নয়:

xstr = lambda s: s or ""

print xstr("a") + xstr("b") # -> 'ab'
print xstr("a") + xstr(None) # -> 'a'
print xstr(None) + xstr("b") # -> 'b'
print xstr(None) + xstr(None) # -> ''

1
এখন পর্যন্ত সবচেয়ে অজগর। অজগরটি কারও সাথে আচরণ করে না, একটি খালি তালিকা, একটি খালি স্ট্রিং, 0, ইত্যাদি মিথ্যা হিসাবে ব্যবহার করে as এছাড়াও বা স্টেটমেন্টটি সত্য যে প্রথম উপাদানটি দেয় বা শেষ উপাদানটি (বা ওর গ্রুপের) দেওয়া হয়েছে তা ব্যবহার করে। এছাড়াও এটি ল্যাম্বদা ফাংশন ব্যবহার করে। আমি আপনাকে +10 দেব তবে স্পষ্টতই এটি আমাকে দেবে না।
ম্যাট

11
এটি 0 এবং মিথ্যা রূপান্তরিত করবে (এবং যে কোনও কিছু যা বুল () এ পাস করার সময় মিথ্যাতে মূল্যায়ন করে)
আর্কাদি

9
আমি মনে করি না এটি "এখন পর্যন্ত সর্বাধিক পাইথোনিক"। এটি অন্য ভাষাগুলির একটি সাধারণ প্রতিভা এবং আমি পাইথনে এটি ব্যবহার করা ভুল বলে মনে করি না, তবে শর্তসাপেক্ষ অভিব্যক্তিগুলি যেখানে এই জাতীয় কৌশলগুলি এড়াতে সুনির্দিষ্টভাবে প্রবর্তিত হয়েছিল।
রবার্তো বনভ্যালেট

2
এটি তৈরি করে [], {}ইত্যাদি একই ফলাফল দেয় Noneযা পছন্দসই নয়। xstr(False)বিশেষত "False"পরিবর্তে হওয়া উচিত ""। ল্যাম্বডাসকে আপত্তিজনকভাবে খারাপ উদাহরণ দেওয়া যায়, def xstr(s): return s or ""আপনি সমস্ত কিছু এক লাইনে রাখতে চান IR ব্যবহার করুন।

5
নোট করুন যে আমি "আপনার যদি জানা থাকে যে মানটি সর্বদা হয় একটি স্ট্রিং বা কোনও নয়" দিয়ে শুরুতে আমার উত্তরটি যোগ্য করে তুলেছিলাম।
বিনয় সাজিপ

59

return s or '' আপনার বর্ণিত সমস্যার জন্য ঠিক কাজ করবে!


4
ওয়ার্থ লক্ষ করেন, এই যখন গুলি মিথ্যা অথবা 0 জন্য একটি ভিন্ন ফলাফলের দেব (আপডেট যার মূল পংক্তি প্রশ্ন নয়, কিন্তু।)
Oddthinking

@ অ্যাডথিংকিং s = Falseবা s = 0সম্ভবত এটির ব্যবহারের পক্ষে একটি প্রান্তের কেস এবং এটি লিখে সহজেই হ্রাস করা যেতে পারেreturn str(s or '')
উইলিম ভ্যান কেটভিচ

@ উইলেমওয়ানকিটভিচ: এর ঠিক একই সমস্যা রয়েছে: গুলি (মিথ্যা) উচিত 'মিথ্যা' ফিরিয়ে দেওয়া উচিত, '' নয়। গুলি (0) '0' নয়, '' প্রত্যাবর্তন করবে। একইভাবে এমন কোনও সামগ্রীর জন্য যা __bool__ বা __nonzero__ সংজ্ঞায়িত করে।
অডথিংকিং

@ অ্যাডডিংকিং আমি আপনার বক্তব্যটি দেখতে পাচ্ছি। যে কোনও ক্ষেত্রে, যদি ওপির প্রশ্নে স্ট্রিং অবজেক্টের জন্য এটি একচেটিয়াভাবে ব্যবহৃত হয় তবে এটি কোনও সমস্যা হওয়া উচিত নয়।
উইলেম ভ্যান কেটভিচ 13:53

@ উইলমওয়ানকিটভিচ: আপডেট হওয়া প্রশ্ন এবং আমার মন্তব্যে
সতর্কতা অবলম্বন


8

কার্যকরী উপায় (এক-লাইনার)

xstr = lambda s: '' if s is None else s

1
"ডিএফ এক্সস্টার (গুলি): রিটার্ন '' যদি সেগুলি অন্য কেউ না হয় তবে 'এটিও অন-লাইনার,
অজগরটি

2
এটা কোন বাস্তব এক-লাইনের, এটা ঠিক এক লাইন লেখা হচ্ছে গ্রাম
দারিও

1
কোন অর্থে এটি সত্যিকারের অনলাইন নয়? আপনার দোভাষীকে পরীক্ষা করুন - এটি কোনও সিনট্যাক্স ত্রুটি নয়। সমস্ত অভিপ্রায় এবং উদ্দেশ্যে এটি ল্যাম্বডা ^ _ ^ থেকে
সত্যই সত্য

2
পিইপি 8 টি প্রজাতি যা আপনার ভেরিয়েবলের কাছে ল্যাম্বদা দেওয়ার পরিবর্তে ডিএফ ব্যবহার করা উচিত। ল্যাম্বদার একমাত্র আসল সুবিধা হ'ল আপনি মতপ্রকাশের অংশ হিসাবে লিখতে পারেন (উদাহরণস্বরূপ অন্য কোনও ফাংশনে যাওয়ার জন্য) এবং সেই সুবিধাটি এই জাতীয় কোডে হারিয়ে যায়। আমি এটিও করতাম, যতক্ষণ না আমি লক্ষ্য করেছি যে ডিফ একটি লাইনে লেখা যেতে পারে এবং তারপরে পিইপি 8 আমাকে যাওয়ার পথ দেখায়। সবসময় অজগর দেবতাদের অনুসরণ করে।
গাই

8

অন্য কয়েকটি উত্তর সম্পর্কে এই বিল্ডিংটি করার জন্য একটি ঝরঝরে এক-লাইনার:

s = (lambda v: v or '')(a) + (lambda v: v or '')(b)

বা এমনকি:

s = (a or '') + (b or '')

এমনকি উল্লেখ কেন (lambda v: v or '')?
Tvde1

কেন না? দামের জন্য 2 টিপস! 😀
উইলেম ভ্যান কেটভিচ

1
দয়া করে সচেতন হন Falseএবং খালি তালিকাটিও '' এ পরিণত হবে।
নিক ও'লাই

একই জন্য 0, ইত্যাদি
ওয়াল্টার ট্রস

6
def xstr(s):
    return {None:''}.get(s, s)

আমি মনে করি, এটি বরং অতিকথনীয় - এটি সম্পর্কে কীভাবে: "xstr = ল্যাম্বদা এস: {কিছুই নয়: ''}। গেট (গুলি, গুলি)" - পুরো জিনিসটিকে এক-লাইনে পরিণত করে।
জুয়ারজেন

14
অপ্রয়োজনীয়ভাবে ধীর (অতিরিক্ত ডিক নির্মাণ এবং চেহারা), এবং আরও শক্তিশালী। বেশ অযৌক্তিক।
ট্রিপটিচ

তুমি ঠিক বলছো. এটি বরং ধ্বংসাত্মক তবে এটি পাইথন বাইকোডে শর্তযুক্ত জাম্প এড়ায়।
tobidope

4
গেট () ফাংশন কলটি কমপক্ষে একটি অতিরিক্ত শর্তযুক্ত জাম্প বোঝায়।
ট্রিপটিচ

1
আমি প্রশ্নটি না জেনে বা ততক্ষণ না করে এটি কী করা উচিত তা বলতে সক্ষম হবো না get
দারিও

5

আমি সর্বোচ্চ ফাংশন ব্যবহার করি:

max(None, '')  #Returns blank
max("Hello",'') #Returns Hello

কবজির মতো কাজ করে;) ফাংশনের প্রথম প্যারামিটারে কেবল আপনার স্ট্রিংটি রাখুন।


5
এটি কাজ করে কারণ 'str'> 'NoNype', এবং সিপিথন নির্দিষ্ট। ম্যানুয়াল থেকে : "সংখ্যা ব্যতীত বিভিন্ন ধরণের অবজেক্টগুলি তাদের প্রকারের নাম অনুসারে অর্ডার করা হয়"। এছাড়াও, এটি পাইথন 3000 এ কাজ করবে না, যেহেতু আন্তঃ-টাইপ তুলনা আর অনুমোদিত হয় না (TypeError: অকেজোযোগ্য প্রকার: <()> ননটাইপ ())। দেখুন কিভাবে পাইথন তুলনা করা যায় স্ট্রিং এবং int?
plok

ধন্যবাদ জানার জন্য ভাল, তাই পাইথন 3.x সামঞ্জস্যপূর্ণ কোডটি নিয়ে এগিয়ে যাওয়া ভাল ধারণা নয়।
রডটেক

4

পাইথন ২.৪ এর সাথে সামঞ্জস্য করার প্রয়োজন হলে উপরের দিকের পার্থক্য

xstr = lambda s: s is not None and s or ''

2

এটি যদি ফর্ম্যাট করার স্ট্রিং সম্পর্কে হয় তবে আপনি নিম্নলিখিতগুলি করতে পারেন:

from string import Formatter

class NoneAsEmptyFormatter(Formatter):
    def get_value(self, key, args, kwargs):
        v = super().get_value(key, args, kwargs)
        return '' if v is None else v

fmt = NoneAsEmptyFormatter()
s = fmt.format('{}{}', a, b)

1
def xstr(s):
    return s if s else ''

s = "%s%s" % (xstr(a), xstr(b))

5
এটি সমস্ত মিথ্যা-সদৃশ মানগুলির জন্য একটি খালি স্ট্রিং ফিরিয়ে দেবে, এটি পোস্টার যা চেয়েছিল তা নয়।
ট্রিপটিচ

1

নীচে বর্ণিত পরিস্থিতিতে আমরা সর্বদা টাইপ কাস্টিং এড়াতে পারি।

customer = "John"
name = str(customer)
if name is None
   print "Name is blank"
else: 
   print "Customer name : " + name

উপরের উদাহরণে ভেরিয়েবল গ্রাহকের মান কোনওটি নয়, এটি 'নাম' বরাদ্দের সময় কাস্টিং হয়ে যায়। 'যদি' ধারাটিতে তুলনা সর্বদা ব্যর্থ হয়।

customer = "John" # even though its None still it will work properly.
name = customer
if name is None
   print "Name is blank"
else: 
   print "Customer name : " + str(name)

উপরের উদাহরণটি সঠিকভাবে কাজ করবে। যখন ইউআরএল, জেএসওএন বা এক্সএমএল থেকে মানগুলি আনা হচ্ছে বা মানগুলি কোনও ধরণের হেরফেরের জন্য আরও টাইপ কাস্টিংয়ের প্রয়োজন হয় তখন এ জাতীয় দৃশ্যগুলি খুব সাধারণ।


0

শর্ট সার্কিট মূল্যায়ন ব্যবহার করুন:

s = a or '' + b or ''

যেহেতু + স্ট্রিংগুলিতে খুব ভাল অপারেশন নয়, তাই আরও ভাল বিন্যাসের ফর্ম্যাট স্ট্রিংগুলি:

s = "%s%s" % (a or '', b or '')

2
এটি 'ক' খালি স্ট্রিংগুলিতে রূপান্তর করবে সমস্ত মিথ্যা-জাতীয় মানগুলির জন্য, কেবল কোনও নয়। উদাহরণস্বরূপ, খালি টিপলস, তালিকাগুলি এবং ডিক্টগুলি খালি স্ট্রিংয়ে রূপান্তরিত হবে, যা ওপি নির্দিষ্ট করে না।
ট্রিপটিচ

+দুটি স্ট্রিংয়ের জন্য একেবারে ভাল অপারেটর। আপনি যখন সমস্যায় পড়েছেন এমন কয়েকজনকে যোগদানের জন্য এটি ব্যবহার করার চেষ্টা করবেন তখনই এটি হয়। দুটির জন্য, সম্ভবত এটি অন্যান্য বিকল্পগুলির চেয়ে দ্রুত হবে ; যেভাবেই হোক না কেন, তা হৈ চৈ।
kquinn

আমার জন্য +1 কারণ এটি আমার ক্ষেত্রে ঠিক আমার প্রয়োজন: লাম্বদা বা ফাংশনটি কোনও একক অপারেটরকে প্রতিস্থাপন করতে ( or) আমার কাছে কিছুটা ওভারকিল বলে মনে হয় ... আমার কাছে অন্যান্য মিথ্যা মানগুলির মামলা নেই - হয় স্ট্রিং বা কোনও নয় None +অপারেটর সম্পর্কে মন্তব্য ব্যতীত , যা নির্দিষ্ট দৃশ্যের উপর নির্ভর করে এবং হয়ত বেঞ্চমার্কিংয়ের প্রয়োজন হতে পারে, এই উত্তরটি -1 এর যোগ্য নয়
নগর

-3

যদি আপনি পাইথন v3.7 ব্যবহার করেন তবে এফ স্ট্রিংটি ব্যবহার করুন

xstr = F"{s}"

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