একটি পাইথন তালিকাকে স্ট্রিংয়ের সাথে ছোট এবং বড় হাতের অক্ষরে রূপান্তর করুন


261

আমার কাছে পাইথন তালিকার পরিবর্তনশীল রয়েছে যাতে স্ট্রিং রয়েছে। অজগর ফাংশন আছে যা একটি পাসের সমস্ত স্ট্রিংকে ছোট হাতের মধ্যে এবং তার বিপরীতে, বড় হাতের মধ্যে রূপান্তর করতে পারে?


"এক পাসে" কেন? আপনি এটি একাধিক পাস নেওয়ার সম্ভাবনা চিন্তা করে?
জন মাচিন

আউটপুট কী হতে হবে?
ওআরকা

উত্তর:


440

এটি তালিকা বোঝার সাথে করা যেতে পারে। এগুলি মূলত রূপ নেয় [function-of-item for item in some-list]। উদাহরণস্বরূপ, একটি নতুন তালিকা তৈরি করতে যেখানে সমস্ত আইটেম লোয়ার-কেসড হয় (বা দ্বিতীয় স্নিপেটে আপার-কেসড), আপনি ব্যবহার করতে পারেন:

>>> [x.lower() for x in ["A","B","C"]]
['a', 'b', 'c']

>>> [x.upper() for x in ["a","b","c"]]
['A', 'B', 'C']

আপনি mapফাংশনটি ব্যবহার করতে পারেন :

>>> map(lambda x:x.lower(),["A","B","C"])
['a', 'b', 'c']
>>> map(lambda x:x.upper(),["a","b","c"])
['A', 'B', 'C']

12
পাইথন 2-তে মানচিত্রের ফাংশন প্রত্যাশার মতো কাজ করে তবে পাইথন 3 তে আপনি ম্যাপটি তালিকার একটি তালিকাতে মোড়ানোর জন্য:list(map(lambda x:x.upper(),["a","b","c"]))
টম এস

39
মানচিত্র সহ দ্বিতীয় প্রস্তাবটি সঠিক তবে অপচয়যোগ্য। ল্যাম্বদা ফাংশন করার কোনও মানে নেই । স্রেফ ব্যবহার করুনmap(str.lower, ["A","B","C"])
ফ্রেপলু

1
যখন আমি এই কলটির পরে কোনও তালিকা মুদ্রণের চেষ্টা করি তখন কোনও পরিবর্তন হয় না। তা কেন?
নকল করুন

1
@ মিমিক খানিকটা দেরী করে, তবে এটির জন্য লোকেরা আসার জন্য আমি আপনার সমস্যাটি অনুমান করছি সম্ভবত আপনি তালিকাটি বোঝার ফলাফলটি আপনার তালিকায় ফিরিয়ে দিচ্ছেন না। কেবল তালিকা বোধগম্য করতে মানটি ফেরত দেয় তবে এটি তালিকা পরিবর্তনশীলটিতে পুনরায় সাইন করে না।
মাইকেল কলবার

52

(অনেক লোকের জন্য) পড়া সহজ হওয়া ছাড়াও তালিকাগুলিও গতি দৌড়ে জিততে পারে:

$ python2.6 -m timeit '[x.lower() for x in ["A","B","C"]]'
1000000 loops, best of 3: 1.03 usec per loop
$ python2.6 -m timeit '[x.upper() for x in ["a","b","c"]]'
1000000 loops, best of 3: 1.04 usec per loop

$ python2.6 -m timeit 'map(str.lower,["A","B","C"])'
1000000 loops, best of 3: 1.44 usec per loop
$ python2.6 -m timeit 'map(str.upper,["a","b","c"])'
1000000 loops, best of 3: 1.44 usec per loop

$ python2.6 -m timeit 'map(lambda x:x.lower(),["A","B","C"])'
1000000 loops, best of 3: 1.87 usec per loop
$ python2.6 -m timeit 'map(lambda x:x.upper(),["a","b","c"])'
1000000 loops, best of 3: 1.87 usec per loop

4
তালিকার বোঝাপড়া মানচিত্রের চেয়ে দ্রুত কেন পিছনের কারণটি জানেন?
নিক্সুজ

6
এটি সবসময় দ্রুত হয় না। এটি যেখানে নেই তা এখানে একটি উদাহরণ রয়েছে: stackoverflow.com/questions/1247486/… তবে এই ক্ষেত্রে এটি খুব ধীর নয় । একটি ল্যাম্বডা ব্যবহার স্পষ্টতই একটি বড় পার্থক্য করে। পারফরম্যান্স ইস্যুগুলিতে বিশেষত পাইথনে আপনার অন্তর্দৃষ্টি সম্পর্কে বিশ্বাস করা কেন বিপদজনক তা আরও উদাহরণ রয়েছে।
নেড ডিলি

3
অজগর 3-তে, mapরেসটি জিতেছে, তবে কিছুই করেনি :)
জিন-ফ্রান্সোয়েস ফ্যাব্রে

@NedDeily map(str.lower,["A","B","C"])দ্রুততম python3.7.5 হয়
Shivam জিন্দাল


20

তালিকা অনুধাবন হ'ল আমি এটি কীভাবে করব, এটি "পাইথোনিক" উপায়। নিম্নলিখিত ট্রান্সক্রিপ্টটি দেখায় কীভাবে একটি তালিকা সমস্ত আপার কেস থেকে তারপর নিম্নে ফিরে যায়:

pax@paxbox7:~$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> x = ["one", "two", "three"] ; x
['one', 'two', 'three']

>>> x = [element.upper() for element in x] ; x
['ONE', 'TWO', 'THREE']

>>> x = [element.lower() for element in x] ; x
['one', 'two', 'three']

2
ভুল, listভেরিয়েবলের নাম হিসাবে ব্যবহার করা সবচেয়ে ভাল পছন্দ নয় :)
জিন-ফ্রান্সোয়েস

না তবে, যেহেতু নামটি দেখানো হচ্ছে পদ্ধতিটির পক্ষে খুব একটা গুরুত্ব নেই তাই এটি আসলেই প্রাসঙ্গিক নয়। তবে কেউ কোডটি যেমন ব্যবহার করতে চায় সে ক্ষেত্রে আমি নামটি পরিবর্তন করব।
প্যাক্সিডিয়াবল

স্ট্যাকওভারফ্লো এর যাদু: ল্যাম্বডা যেখানে এটি করা উচিত নয় ব্যবহার করে অজগর 2-একমাত্র সমাধানের জন্য 250 ভোট! ভাল এখন 249
জিন-ফ্রান্সোইস ফ্যাব্রে

@ জিন-ফ্রেঞ্চোইসফ্যাব্রে, আপনি কেন এটি একে পাইথন-টু-সলিউশন বলে মনে করেন তা নিশ্চিত নন। প্রতিলিপিগুলি যেমন দেখায়, এটি স্পষ্টভাবে পাইথনের ৩.৩.২ এর অধীনে চলছে। আসলে, আমি এটি নিশ্চিত করার জন্য আবার এটি পরীক্ষা করেছিলাম checked ... কিছু সময় যখন আমি তদন্ত ... বাস্তবিক, কিছু মনে করবেন না, মনে হচ্ছে আপনি এই এক বর্তমান গৃহীত উত্তর বদলে সম্পর্কে কথা বলা হয়েছে, তাই আপনি সম্ভবত মন্তব্য করা উচিত পাসের সেখানে এখানে বদলে। সন্দেহ নেই একটি সৎ ভুল। চিয়ার্স।
প্যাক্সডিয়াবলো

1
হ্যাঁ, আমি আপনার সমালোচনা করছিলাম না (স্টাফগুলি বাদ দিয়ে list:)) আপনি সম্প্রতি যে ইউভি পেয়েছেন তা কোথা থেকে এসেছে বলে আপনি মনে করেন? :)
জিন-ফ্রান্সোইস ফ্যাব্রে

7

এই নমুনার জন্য বোধগতি দ্রুততম

$ পাইথন-মি টাইমিট-এস 's = ["এক", "দুই", "তিন"] * 1000' '[এক্স-এক্স এর জন্য এক্স]
1000 লুপগুলি, প্রতি লুপে 3: 809 ইউএসসি সেরা

$ পাইথন-মি টাইমিটিট-এস 's = ["এক", "দুই", "তিন"] * 1000' 'মানচিত্র (স্ট্রিয়াল আপার, গুলি)'
1000 লুপগুলি, প্রতি লুপে 3: 1.12 মেসি থেকে সেরা

$ পাইথন-মি টাইমিট-এস 's = ["এক", "দুই", "তিন"] * 1000' 'মানচিত্র (ল্যাম্বদা এক্স: এক্স.অপার (), গুলি)'
1000 লুপগুলি, প্রতি লুপে 3: 1.77 ম্যাক্সের মধ্যে সেরা

5

একজন শিক্ষার্থী জিজ্ঞাসা করছে, একই সমস্যার উত্তর দেওয়া অন্য শিক্ষার্থী :))

fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
newList = []
for fruit in fruits:
    newList.append(fruit.upper())
print(newList)

3
mylist = ['Mixed Case One', 'Mixed Case Two', 'Mixed Three']
print(list(map(lambda x: x.lower(), mylist)))
print(list(map(lambda x: x.upper(), mylist)))

2

সমাধান:

>>> s = []
>>> p = ['This', 'That', 'There', 'is', 'apple']
>>> [s.append(i.lower()) if not i.islower() else s.append(i) for i in p]
>>> s
>>> ['this', 'that', 'there', 'is','apple']

এই সমাধানটি ছোট হাতের আইটেমগুলি সম্বলিত পৃথক তালিকা তৈরি করবে, তাদের আসল কেস নির্বিশেষে। যদি আসল কেসটি উপরের হয় তবে list sএতে সংশ্লিষ্ট আইটেমের ছোট হাতের অক্ষর থাকবে list p। যদি তালিকার আইটেমটির মূল কেসটি ইতিমধ্যে ছোট হাতের অক্ষরে থাকে list pতবে list sআইটেমটির কেসটি ধরে রাখবে এবং এটিকে ছোট হাতের অক্ষরে রাখবে। এখন আপনি list sপরিবর্তে ব্যবহার করতে পারেন list p


1

যদি আপনার উদ্দেশ্যটি একটি পাসে রূপান্তর করে অন্য স্ট্রিংয়ের সাথে মিলে যায় তবে আপনি str.casefold()পাশাপাশি ব্যবহার করতে পারেন ।

এটি কার্যকর যখন আপনার অ-এস্কি অক্ষর থাকে এবং এসকিআই সংস্করণগুলির সাথে মিলে যায় (যেমন: মাই বনাম ম্যাসেস) suchএমন ক্ষেত্রে ব্যর্থ str.lowerবা str.upperব্যর্থ হলে str.casefold()পাস হবে। এটি পাইথন 3 এ উপলভ্য এবং https://stackoverflow.com/a/31599276/4848659 উত্তর সহ ধারণাটি নিয়ে বিস্তারিত আলোচনা করা হয়েছে ।

>>>str="Hello World";
>>>print(str.lower());
hello world
>>>print(str.upper());
HELLO WOLRD
>>>print(str.casefold());
hello world

1

শীর্ষ উত্তরের একটি আরও সহজ সংস্করণ এখানে @ অ্যামারফিউস দ্বারা দেওয়া হয়েছে

ভ্যালুতে মানগুলির একটি তালিকা সহ:

valsLower = [item.lower() for item in vals]

এটি একটি f = উন্মুক্ত () পাঠ্য উত্স দিয়ে আমার পক্ষে ভাল কাজ করেছে।


1

আপনি ব্যবহার করে চেষ্টা করতে পারেন:

my_list = ['india', 'america', 'china', 'korea']

def capitalize_list(item):
    return item.upper()

print(list(map(capitalize_list, my_list)))

0

Python3.6.8

In [1]: a = 'which option is the fastest'                                                                                                                                           

In [2]: %%timeit 
   ...: ''.join(a).upper() 
762 ns ± 11.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [3]: %%timeit  
   ...: map(lambda x:x.upper(), a) 
209 ns ± 5.73 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [4]: %%timeit  
   ...: map(str.upper, [i for i in a]) 
1.18 µs ± 11.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [5]: %%timeit 
   ...: [i.upper() for i in a] 
3.2 µs ± 64.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

আপনার যদি আউটপুট হিসাবে স্ট্রিং বা তালিকার প্রয়োজন হয় এবং এটির পুনরুক্তিকারী নয় (এটি পাইথন 3 এর জন্য) তবে এর সাথে ''.join(string).upper()বিকল্পটি তুলনা করুন :

In [10]: %%timeit  
    ...: [i for i in map(lambda x:x.upper(), a)] 
4.32 µs ± 112 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

0

আপনি যদি সমস্ত স্ট্রিংকে তালিকার ছোট হাতের অক্ষরে রূপান্তর করার চেষ্টা করছেন, আপনি পান্ডা ব্যবহার করতে পারেন:

import pandas as pd

data = ['Study', 'Insights']

pd_d = list(pd.Series(data).str.lower())

আউটপুট:

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