पायथन: खाली स्ट्रिंग में कोई नहीं बदलने के लिए सबसे मुहावरेदार तरीका?


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
@GuiSim: मैं पक्षपाती हो सकता हूं, लेकिन मेरा जवाब लगभग एक सामान्य अंग्रेजी वाक्य की तरह पढ़ता है ...
SilentGhost

1
"यदि एस कोई नहीं है, तो एक खाली स्ट्रिंग लौटाएं; अन्यथा, [स्ट्रिंग ऑफ] एस वापस करें।" प्रश्न से कोड सामान्य अंग्रेजी वाक्य की तरह भी पढ़ता है।

क) यदि स्ट्रिंग sएक तानाशाह के लुकअप से आई है जहां कुंजी नहीं मिली है, तो उपयोग करेंdict.get(key, '')
जूल

b) यदि आप केवल आउटपुट स्वरूपण (जैसे प्रिंट के लिए) के लिए यह स्ट्रिंग-रूपांतरण चाहते हैं, तो आप सीधे {... {}} प्रारूप कर सकते हैं (तानाशाही (1)) `
smci

जवाबों:


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
@guneysus वे समान नहीं हैं: not False == Trueलेकिन False is None == False
लिन

धन्यवाद @Lynn आप सही हैं। मुझे अपनी गलती का एहसास हुआ। लेकिन मैं जानता हूँ (या मान) sहमेशा एक str / यूनिकोड प्रकार में या 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
मैं इसे और अधिक सराहनीय मामले पर जोर देने के लिए बदलूंगा: यदि कोई और नहीं है तो "s वापस लौटाएं" "
Ber

5
@Ber: मैं इसे एक नकारात्मक नकारात्मक से बचने के लिए, के रूप में रखूँगा।
निखिल चेलियाह

8
यह एक अच्छा उदाहरण है कि कैसे .. and .. or ..विफल हो जाता है और क्यों और क्यों पसंद किया जाता है। में दो सूक्ष्म कीड़े हैं s is not None and s or ''

1
return '' if not s else str(s)
इकबाल

110

शायद सबसे छोटा होगा str(s or '')

क्योंकि कोई भी व्यक्ति गलत नहीं है, और यदि x गलत है तो "x या y" रिटर्न देता है। विस्तृत विवरण के लिए बूलियन ऑपरेटरों को देखें । यह छोटा है, लेकिन बहुत स्पष्ट नहीं है।


1
यह बहुत अच्छा है, धन्यवाद! orइस तरह का उपयोग करने के बारे में कभी नहीं सोचा था
user25064

15
यह काम नहीं करता है यदि s0, गलत है, या किसी भी झूठी कीमत है
समझदार

4
ठीक है, यह ऑप की आवश्यकता में उल्लेख नहीं किया गया है, इसलिए मैं यहां आपकी बात नहीं देखता।
dorvak

2
@dorvak ओपी आवश्यकता के बारे में काफी स्पष्ट है कि आउटपुट ''iff होना चाहिए s is None। अन्य सभी इनपुट वापस चाहिए s(या str(s)संशोधित अनुरोध में)।
StvnW

2
@ डकैती: यह काम नहीं करेगा। यदि sहै None, तो परिणाम xstr()एक रिक्त स्ट्रिंग होना चाहिए, लेकिन स्ट्रिंग str(None)देता है "None", जो कि लौटा हुआ है (चूंकि स्ट्रिंग "None"एक मिथ्या मूल्य नहीं है।
ड्रीमलैक्स

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, आदि को गलत है। इस तथ्य का भी उपयोग करता है कि या कथन पहला तत्व लौटाता है जो सत्य है या (या समूहों के समूह) को दिया गया अंतिम तत्व है। इसके अलावा यह लैम्ब्डा कार्यों का उपयोग करता है। मैं आपको +10 दूंगा लेकिन जाहिर है कि यह मुझे नहीं जाने देगा।
मैट

11
यह 0 और गलत में परिवर्तित हो जाएगा (और कुछ भी जो बूल को पास होने पर गलत मूल्यांकन करता है)
Arkady

9
मुझे नहीं लगता कि यह "अब तक सबसे अधिक पायथोनिक" है। यह अन्य भाषाओं में एक सामान्य मुहावरा है, और मुझे नहीं लगता कि पायथन में इसका उपयोग करना गलत है, लेकिन सशर्त अभिव्यक्ति जहां इस तरह की चाल से बचने के लिए सटीक रूप से पेश की गई है।
रॉबर्टो बोनटलेट

2
यह बनाता है [], {}आदि, के रूप में एक ही परिणाम दे None, जो वांछित नहीं है। xstr(False)विशेष रूप से, किया जाना चाहिए "False"के बजाय ""। लैंबडस का दुरुपयोग करना एक खराब उदाहरण के लिए बनाता है, def xstr(s): return s or ""इर का उपयोग करें जिसे आप इसे एक पंक्ति में रखना चाहते हैं।

5
ध्यान दें कि मैंने अपना उत्तर "यदि आप जानते हैं कि मूल्य हमेशा एक स्ट्रिंग या कोई नहीं होगा" के साथ शुरू में योग्य है।
विनय साजिप

59

return s or '' अपनी समस्या के लिए ठीक काम करेगा!


4
वर्थ नोटिंग कि यह तब के लिए एक अलग परिणाम देगा जब s गलत है या 0 (जो मूल स्ट्रिंग प्रश्न नहीं है, लेकिन अपडेट किया गया है।)
Oddthinking

@ ध्यान देना s = Falseया s = 0इसके उपयोग में एक किनारे का मामला होने की संभावना होगी और इसे आसानी से लिखकर कम किया जा सकता हैreturn str(s or '')
विलेम वैन केटविच

@WillemvanKetwich: जिसमें बिल्कुल समान समस्या है: s (गलत) को 'गलत' लौटना चाहिए, न कि ''। s (0) को '0' लौटना चाहिए, '' नहीं। इसी तरह __bool__ या __nonzero__ को परिभाषित करने वाली वस्तु के लिए।
अजीब

@ मैं आपकी बात देख रहा हूं। किसी भी मामले में, अगर यह विशेष रूप से स्ट्रिंग ऑब्जेक्ट्स के लिए उपयोग किया जाता है जैसे कि ओपी के प्रश्न में यह एक मुद्दा नहीं होना चाहिए।
विलेम वैन केटविच

@WillemvanKetwich: अद्यतन प्रश्न और मेरी टिप्पणी में चेतावनी पर एक नज़र - यह कवर किया गया है,
Oddthinking

14
def xstr(s):
   return s or ""

4
यह रिटर्न ''के लिए 0, [], {}, Falseऔर झूठे की तरह मान है, जो नहीं है क्या पोस्टर के लिए कहा।
स्टवानोव

1
बस स्ट्रै ([...]) को एस के चारों ओर डालें: def xstr(s): return str(s) or ""
फेडेरिको सिमोनिटा

8

कार्यात्मक तरीका (वन-लाइनर)

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

1
"डीफ़ एक्सट्रस्ट (एस): रिटर्न '' अगर एस इज अनदर एस" एक ऑन-लाइनर भी है, तो अजगर
व्हाट्सएप के

2
यह कोई वास्तविक वन-लाइनर नहीं है, यह सिर्फ एक पंक्ति g
दारियो

1
किस अर्थ में यह एक वास्तविक ऑनलाइनर नहीं है? अपने दुभाषिया में जाँच करें - यह एक वाक्यविन्यास त्रुटि नहीं है। सभी इरादों और उद्देश्यों के लिए यह लैम्ब्डा से जिस तरह से असली है ^ _ ^
SilentGhost

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

क्यों नहीं? 1 की कीमत के लिए 2 युक्तियाँ! 😀
विलेम वैन Ketwich

1
कृपया ध्यान रखें कि Falseऔर खाली सूची को भी '' में बदल दिया जाएगा।
निक ओ ललाई

उसी के लिए 0, आदि
वाल्टर ट्रॉस

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

मुझे लगता है, यह बल्कि पाइथोनिक है - यह कैसे के बारे में है: "xstr = lambda s: {कोई नहीं '' '}। Get (s, s)" - एक लाइनर के लिए पूरी चीज को कम कर देता है।
Juergen

14
अनावश्यक रूप से धीमा (अतिरिक्त तानाशाह निर्माण और देखने), और पढ़ने में कठिन। बहुत अहानिकर है।
त्रिपिटक

आप सही हे। यह बल्कि खतरनाक है लेकिन यह अजगर बाइटकोड में एक सशर्त कूद से बचा जाता है।
टोबिडोप

4
फ़ंक्शन () फ़ंक्शन कॉल का तात्पर्य कम से कम एक अतिरिक्त सशर्त कूद है।
त्रिपिटक

1
मैं यह कहने में सक्षम नहीं हूं कि प्रश्न को जानने या देखने के बिना यह क्या करना चाहिए get
दारियो

5

मैं अधिकतम फ़ंक्शन का उपयोग करता हूं:

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

आकर्षण की तरह काम करता है;) फ़ंक्शन के पहले पैरामीटर में बस अपना स्ट्रिंग डालें।


5
यह काम करता है क्योंकि 'str'> 'noneType', और CPython विशिष्ट है। से मैनुअल : "संख्या को छोड़कर विभिन्न प्रकार की वस्तुएं उनके प्रकार नामों से आदेश दिया जाता है"। इसके अलावा, यह पायथन 3000 में काम नहीं करेगा, क्योंकि अंतर-प्रकार की तुलना की अब अनुमति नहीं है (TypeError: unorderable type: str ()> noneType ())। देखें कि पायथन स्ट्रिंग और इंट की तुलना कैसे करता है?
Plok

धन्यवाद जानने के लिए अच्छा है, इसलिए अजगर 3.x संगत कोड के साथ आगे बढ़ने वाला एक अच्छा विचार नहीं है।
राडेक

4

यदि आपको पायथन 2.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)

ऊपर का उदाहरण ठीक से काम करेगा। जब URL, JSON या XML से मान प्राप्त किए जा रहे हों तो ऐसे परिदृश्य बहुत सामान्य होते हैं या मानों को किसी भी हेरफेर के लिए आगे टाइप कास्टिंग की आवश्यकता होती है।


0

शॉर्ट सर्किट मूल्यांकन का उपयोग करें:

s = a or '' + b or ''

चूँकि + स्ट्रिंग्स पर बहुत अच्छा संचालन नहीं है, इसलिए बेहतर फॉर्मेट स्ट्रिंग्स का उपयोग करें:

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

2
यह सभी असत्य जैसे मूल्यों के लिए 'ए' को खाली स्ट्रिंग में बदल देगा, न कि केवल किसी को भी। उदाहरण के लिए, खाली ट्यूपल्स, सूचियाँ और डिक्ट्स रिक्त स्ट्रिंग्स में परिवर्तित हो जाएंगे, जो कि ओपी निर्दिष्ट नहीं है।
तृप्तिकाल

+दो तार के लिए एक अच्छा ऑपरेटर है। ऐसा तब होता है जब आप इसे दर्जनों में शामिल होने के लिए उपयोग करने की कोशिश करते हैं जिससे आपको परेशानी होती है। दो के लिए, यह शायद अन्य विकल्पों की तुलना में तेज़ होगा ; किसी भी तरह से, यह शोर में है।
क्क्विन

मेरे लिए +1 का कारण यह है कि मुझे अपने मामले में ठीक वैसा ही चाहिए: एक ऑपरेटर ( or) को बदलने के लिए लंबोदा या फ़ंक्शन मेरे लिए बहुत अधिक लगता है ... मेरे पास अन्य गलत मूल्यों के मामले नहीं हैं - या तो str या कोई नहीं। +ऑपरेटर पर टिप्पणी के अलावा , जो विशिष्ट परिदृश्य पर निर्भर हो सकता है और बेंचमार्किंग की आवश्यकता हो सकती है, इस जवाब में एक -1
शहरी

-3

यदि आप अजगर v3.7 का उपयोग कर रहे हैं तो F स्ट्रिंग का उपयोग करें

xstr = F"{s}"

1
यह गलत है और 'None'अगर sहै तो स्ट्रिंग लौटाता है None
लॉरेंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.