सर्प प्रकरण को कम ऊँट के मामले में परिवर्तित करना (लोअरमेक्सेलकेस)


80

my_stringपाइथन 2.7 में साँप के मामले ( ) को कम ऊँट के मामले (myString) से बदलने का एक अच्छा तरीका क्या होगा ?

स्पष्ट समाधान अंडरस्कोर द्वारा विभाजित करना है, पहले एक को छोड़कर प्रत्येक शब्द को कैपिटल करें और वापस एक साथ जुड़ें।

हालांकि, मैं अन्य, अधिक मुहावरेदार समाधान या RegExpइसे प्राप्त करने के लिए उपयोग करने का एक तरीका (कुछ मामले संशोधक के साथ) के लिए उत्सुक हूं ?


मेरी जानकारी के लिए, इस बॉक्स से बाहर निकलने के लिए कुछ भी नहीं है। क्या आपने अपने समाधान को लागू करने की कोशिश की?
— फ्रैडरिक हमीदी

मेरे सवाल को संपादित किया, मुझे पता है कि कोई अंतर्निहित नहीं है, मैं एक अच्छा कार्यान्वयन ढूंढना चाहता था
— लूका

मुझे नहीं लगता कि यह सवाल किसी भी तरह से 'टॉपिक' है।
— 0xc0de

जवाबों:


148
def to_camel_case(snake_str):
    components = snake_str.split('_')
    # We capitalize the first letter of each component except the first one
    # with the 'title' method and join them together.
    return components[0] + ''.join(x.title() for x in components[1:])

उदाहरण:

In [11]: to_camel_case('snake_case')
Out[11]: 'snakeCase'

11
क्या अन्य डेटालैस कैमलसिंग लागू होंगे?
— जबिटर

20
खैर, यह वास्तव में मुहावरेदार पायथन नहीं है, जो आम तौर पर "अनुमति की तुलना में माफी मांगने के लिए आसान" सिद्धांत का पालन करता है। यदि आप टाइप सुरक्षा चाहते हैं, तो आप 3.5 के साथ टाइप संकेत जोड़ सकते हैं, लेकिन ऐसे कार्यों के लिए if-else के साथ टाइप चेकिंग कर रहे हैं जो इस तरह के रूप में स्पष्ट हैं (स्ट्रिंग्स के अलावा अन्य कैमलकेस संभव हो सकता है?) सिर्फ खराब शैली और अत्यधिक है? मेरी किताब में वाचालता।
— जबिटर

2
बस यहीं दूसरा जुबेर बनना चाहता था। यह to_camel_caseसुनिश्चित करने की जिम्मेदारी नहीं है कि इनपुट एक स्ट्रिंग है, यह कॉलिंग कोड की जिम्मेदारी है। एक गैर-स्ट्रिंग पास करना एक अपवाद को बढ़ाएगा, जो अच्छा है। यही अपवाद हैं।
— केलीबेबक

@stelios भी नहीं। खाली तारों का क्या? और आप अन्यथा क्या करेंगे? क्योंकि इस प्रकार आप एक लौट रहे हैं None। आप किसी एक त्रुटि को रोक नहीं सकते। यदि आप इसे आजमाते हैं तो आप केवल इसके स्रोत को ही समाप्त कर देंगे। वह पायथन है, जावा नहीं। आपको अपवादों से बचना नहीं है, आपको उनका इलाज करना होगा।
— नूनो एंड्रे

1
एक कोने के मामले में, लेकिन अगर आप इसके बजाय _barबनने की उम्मीद barकरते हैं Bar, तो थोड़ा components = snake_str.lstrip('_').split('_')
— ट्विक करें

15

यहाँ अभी तक एक और टेक है, जो केवल पायथन 3.5 और उच्चतर में काम करता है:

def camel(snake_str):
    first, *others = snake_str.split('_')
    return ''.join([first.lower(), *map(str.title, others)])

जब कोई जेनरेटर करेगा तो सूची समझ का उपयोग न करें (यानी, यहाँ join(...)से बेहतर है join([...]), क्योंकि यह सूची बनाए बिना काम करता है)।
— वेदरन Febego

2
आप पूरी तरह से सही हैं, हालांकि यह इस विशेष मामले में लागू नहीं होता है, क्योंकि joinविधि को जो पारित किया गया है वह एक समझ नहीं बल्कि एक नियमित सूची है। यदि आप इन-मेमरी लिस्ट बनाने से बचना चाहते हैं, जिसका आप उपयोग कर सकते हैं itertools.chain, लेकिन तब अगर आप सांप को ऊँट के मामले में परिवर्तित करते समय मेमोरी फुटप्रिंट के बारे में चिंतित हैं तो आपको बहुत बड़ी समस्याएं हैं। ;-)
— बेरिस्लाव लोपैक

क्षमा करें, मैंने इसे गलत बताया (क्योंकि मुझे यहां कैमकलेस के बजाय पास्कलकेस की तलाश थी)। नहीं, यह ठीक है।
— वेदरन Febego

8

अनिवार्य एक-लाइनर:

import string

def to_camel_case(s):
    return s[0].lower() + string.capwords(s, sep='_').replace('_', '')[1:] if s else s

एक अग्रणी अंडरस्कोर होने पर यह विधि विफल हो जाती है (पहला अक्षर छूट जाता है)।
— siebz0r

3
और भी छोटा: return re.sub(r'_([a-z])', lambda x: x.group(1).upper(), name) (यहां देखें)
— मैथ्यू रोडिक


4

एक और एक लाइनर

def to_camel_case(snake_string):
    return snake_string.title().replace("_", "")

4
फर्स्ट चार अपर केस है।
— 13

4

इसमें थोड़ी देर हो गई, लेकिन मैंने कुछ दिन पहले इस पर / आर / अजगर को पाया:

pip install pyhumps

और फिर आप बस कर सकते हैं:

import humps

humps.camelize('jack_in_the_box')  # jackInTheBox
# or
humps.decamelize('rubyTuesdays')  # ruby_tuesdays
# or
humps.pascalize('red_robin')  # RedRobin

1

स्टीव के जवाब पर बिल्डिंग, इस संस्करण को काम करना चाहिए:

def to_camel_case(snake_case_string):
    titleCaseVersion =  snake_case_string.title().replace("_", "")
    camelCaseVersion = titleCaseVersion[0].lower() + titleCaseVersion[1:]
    return camelCaseVersion



0

सूची समझ का उपयोग किए बिना:

def snake_to_camel_case(text_snake):
    return '{}{}'.format(
        text_snake[:1].lower(),
        text_snake.title().replace('_', '')[1:],
    )

0

इसलिए मुझे सांप के मामले के मापदंडों के साथ एक पूरी फाइल को ऊंट मामले में बदलने की जरूरत थी। मैथ्यू रोडिक के समाधान ने सबसे अच्छा काम किया। धन्यवाद।

यहाँ फ़ाइलों पर इसका उपयोग करने के लिए एक छोटी स्क्रिप्ट है।

import re

f = open("in.txt", "r")
words = f.read()

def to_camel_case3(s):
    return re.sub(r'_([a-z])', lambda x: x.group(1).upper(), s)

f = open("out.txt", "w")
f.write(to_camel_case3(words))

0
def toCamel(snake)
    return ''.join( word.capitalize()
                    for word in snake.split('_') )

पूर्ववर्ती अंडरस्कोर से बचने के लिए अंडरस्कोर की अनुमति दें (जैसे 'Escaped__snake' 'Escaped_Snake' बन जाएगा, जबकि 'normal_snake' 'UsualSnake' बन जाता है। रिक्त के लिए टेनरी परीक्षण शामिल करें।

def toCamel(escaped_snake)
    return ''.join( (word.capitalize(), '_')[word=='')
                    for word in escaped_snake.split('_') )

1 सेगमेंट को कैपिटल न करें (यानी, 'tHERE_is_a_snake' बन जाता है 'उसके बाद')

def toCamel(esCAPed_snake)
    words = esCAPed_snake.split('_')
    return words[0].lower() + ''.join( (word.capitalize(), '_')[word=='')
                                       for word in words[1:] )

-2

tocamelcaseसांप के मामले से ऊंट मामले में आसानी से परिवर्तित होने के लिए भी है।

इंस्टॉल

$ pip install tocamelcase

और फिर आप इसे इस तरह से उपयोग कर सकते हैं:

import tocamelcase

print(tocamelcase.convert("non_camel_case"))
# -> non_camel_case → NonCamelCase

वहाँ भी है decamelizeकि इस मॉड्यूल का उलटा है।


यह PascalCase है, इसलिए भी मॉड्यूल नाम भ्रामक है।
— स्टासदीप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.