পাইথনে কমা এবং স্ট্রিপ হোয়াইটস্পেস দ্বারা বিভক্ত করুন


346

আমার কাছে অজগর কোড রয়েছে যা কমাতে বিভক্ত হয়, তবে শ্বেত স্পেসটি ছিড়ে না:

>>> string = "blah, lots  ,  of ,  spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots  ', '  of ', '  spaces', ' here ']

আমি বরং এইভাবে মুছে ফেলা সমাপ্তি দিয়ে শেষ করব:

['blah', 'lots', 'of', 'spaces', 'here']

আমি সচেতন যে আমি তালিকা এবং প্রতিটি আইটেমটি () কে লুপ করতে পারি তবে এটি পাইথন হিসাবে, আমি অনুমান করছি যে এটি করার একটি দ্রুত, সহজ এবং আরও মার্জিত উপায় আছে।

উত্তর:


594

তালিকা অনুধাবন ব্যবহার করুন - সরল এবং forলুপ হিসাবে পড়া ঠিক তত সহজ ।

my_string = "blah, lots  ,  of ,  spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]

দেখুন: তালিকা সংমিশ্রণে পাইথন ডক্স, তালিকা বোধের
একটি ভাল 2 দ্বিতীয় ব্যাখ্যা।


1
অতি ভালো! ফাঁকা তালিকার এন্ট্রিগুলি থেকে মুক্তি পেতে আমি নীচে একটি আইটেম যুক্ত করেছি। > পাঠ্য = [x.strip () x এর জন্য পাঠ্য.স্প্লিট ('।') যদি x! = '']]
র্যান্ডালশনেপিএইচডি

@ শিয়ান: আপনার "পোস্টের মূল উদ্দেশ্য" অবৈধ / অসম্পূর্ণ অজগর কোডটি ছিল? পর্যালোচনা wankers মতে এটা ছিল: stackoverflow.com/review/suggested-edits/21504253 । আপনি দয়া করে অন্যথায় ভুল করে থাকলে (আবার) সংশোধন করে তাদের বলতে পারেন?
খাগড়া

মূল একটি REPL থেকে কপি-পেস্ট করা হয়েছিল (যদি আমি সঠিকভাবে মনে রাখা) এবং গোল (ব্যবহার তালিকা ধী একটি অপারেশন সম্পাদন করতে) অন্তর্নিহিত ধারণার বুঝতে পারছিলাম না - কিন্তু আপনি সঠিক করছি, এটি আরো ইন্দ্রিয় তোলে যদি আপনি দেখতে যে তালিকা ধী একটি নতুন তালিকা উত্পাদন করে।
শান ভিয়েরা

24

নিয়মিত এক্সপ্রেশন ব্যবহার করে বিভক্ত করুন। নোট আমি শীর্ষস্থানীয় স্পেস দিয়ে কেসটিকে আরও সাধারণ করে তুলেছি। তালিকার বোধগম্যতা হল সামনে এবং পিছনে নাল স্ট্রিংগুলি সরিয়ে ফেলা।

>>> import re
>>> string = "  blah, lots  ,  of ,  spaces, here "
>>> pattern = re.compile("^\s+|\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['blah', 'lots', 'of', 'spaces', 'here']

এটি ^\s+মেলে না থাকলেও এটি কাজ করে:

>>> string = "foo,   bar  "
>>> print([x for x in pattern.split(string) if x])
['foo', 'bar']
>>>

এখানে আপনার কেন দরকার: \ s +:

>>> pattern = re.compile("\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['  blah', 'lots', 'of', 'spaces', 'here']

ব্লাহে নেতৃস্থানীয় স্থানগুলি দেখুন?

স্পেসিফিকেশন: উপরে পাইথন 3 ইন্টারপ্রেটার ব্যবহার করে তবে পাইথন 2 এ ফলাফল একই রকম।


8
আমি বিশ্বাস করি [x.strip() for x in my_string.split(',')]প্রশ্নটি জিজ্ঞাসা করা জন্য আরও অজগর। হয়তো এমন কিছু মামলা রয়েছে যেখানে আমার সমাধানের প্রয়োজন। আমি এই বিষয়বস্তু আপডেট করে যদি আমি একটি জুড়ে চালানো।
tbc0

কেন ^\s+প্রয়োজনীয়? আমি আপনার কোডটি এটি ছাড়াই পরীক্ষা করেছি এবং এটি কার্যকর হয় না, তবে কেন তা আমি জানি না।
লাইক

আমি যদি ব্যবহার করি re.compile("^\s*,\s*$"), ফলাফল হয় [' blah, lots , of , spaces, here ']
লাইক

@ laike9m, আমি আপনাকে পৃথকীটি দেখানোর জন্য আমার উত্তর আপডেট করেছি। ^\s+করে তোলে। যেমন আপনি নিজেরাই দেখতে পাচ্ছেন, ^\s*,\s*$পছন্দসই ফলাফলও ফেরায় না। সুতরাং আপনি যদি একটি রেজিপেক্সের সাথে বিভক্ত করতে চান তবে ব্যবহার করুন ^\s+|\s*,\s*|\s+$
tbc0

নেতৃস্থানীয় প্যাটার্ন (^ + s +) না মিলে যদি প্রথম ম্যাচটি খালি হয় তবে আপনি "ফু, বার" স্ট্রিংয়ের জন্য ['', 'ফু', 'বার'] এর মতো কিছু পান get
স্টিভ ম্যাককলি

21

আমি যোগ করতে এসেছি:

map(str.strip, string.split(','))

তবে দেখেছি এটি ইতিমধ্যে একটি মন্তব্যে জেসন ওরেডরফ দ্বারা উল্লেখ করা হয়েছিল ।

একই উত্তরে গ্লেন মেইনার্ডের মন্তব্য পড়ার ফলে মানচিত্রের উপরে তালিকা বোঝার পরামর্শ দেওয়া হয়েছে কেন আমি ভাবতে শুরু করি। আমি ধরে নিয়েছি পারফরম্যান্সের কারণে তার বোঝানো হয়েছে, তবে অবশ্যই তিনি স্টাইলিস্টিক কারণে বা অন্য কিছু (গ্লেন?) বোঝাতে পেরেছিলেন।

সুতরাং আমার বাক্সে একটি দ্রুত (সম্ভবত ত্রুটিযুক্ত?) পরীক্ষাটি তিনটি পদ্ধতি প্রয়োগ করে একটি লুপে প্রকাশিত:

[word.strip() for word in string.split(',')]
$ time ./list_comprehension.py 
real    0m22.876s

map(lambda s: s.strip(), string.split(','))
$ time ./map_with_lambda.py 
real    0m25.736s

map(str.strip, string.split(','))
$ time ./map_with_str.strip.py 
real    0m19.428s

তৈরীর map(str.strip, string.split(',')) , বিজয়ী যদিও মনে হয় তারা ডিস্কের ন্যয় সব আছে।

অবশ্যই মানচিত্রের (ল্যাম্বডা সহ বা ছাড়া) অগত্যা পারফরম্যান্সের কারণে উড়িয়ে দেওয়া উচিত নয় এবং আমার পক্ষে এটি তালিকা বোধের মতো অন্তত পরিষ্কার clear

সম্পাদনা:

উবুন্টু 10.04 এ পাইথন 2.6.5


15

আপনি আলাদা করার আগে কেবল স্ট্রিং থেকে সাদা স্থানটি সরিয়ে ফেলুন।

mylist = my_string.replace(' ','').split(',')

10
কোন সমস্যা হওয়ার কাইন্ড আইটেম পৃথক দ্বারা কমা এমবেডেড স্পেস, যেমন ধারণ করে "you just, broke this"
রবার্ট রসনি

1
গিজ, এর জন্য একটি -1 আপনি ছেলেরা শক্ত। এটি তার সমস্যার সমাধান করে, তার নমুনা ডেটা সরবরাহ করা কেবলমাত্র একক শব্দ এবং ডেটা বাক্যাংশ হবে এমন কোনও স্পেসিফিকেশন নেই। তবে ডাব্লু / ই, আমি অনুমান করি যে আপনি এখানে কীভাবে ঘুরছেন।
ব্যবহারকারী 489041

যাইহোক ধন্যবাদ, ব্যবহারকারী। সুষ্ঠু হওয়ার জন্য যদিও আমি স্পষ্টভাবে বিভক্ত করার জন্য এবং তারপরে স্ট্রিপ () এবং স্ট্রিপটি শীর্ষস্থানীয় এবং অনুসরণকারী শ্বেতস্পেসকে সরিয়ে ফেলেছি এবং এর মধ্যে কোনও কিছুই স্পর্শ করি না। সামান্য পরিবর্তন এবং আপনার উত্তর পুরোপুরি কার্যকর হবে, যদিও: মাইলিস্ট = মাইস্ট্রিং.স্ট্রিপ ()। বিভক্ত (',') যদিও আমি জানি না এটি বিশেষভাবে দক্ষ কিনা।
মিঃ_চিম্প

12

আমি জানি এটি ইতিমধ্যে উত্তর দেওয়া হয়েছে, তবে আপনি যদি এটি অনেক কিছু করে শেষ করেন তবে নিয়মিত ভাব প্রকাশের আরও ভাল উপায় হতে পারে:

>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']

\sকোনো হোয়াইটস্পেস অক্ষর মিলে যায়, এবং আমরা শুধু একটি খালি স্ট্রিং সঙ্গে এটি প্রতিস্থাপন ''। আপনি এখানে আরও তথ্য পেতে পারেন: http://docs.python.org/library/re.html#re.sub


3
আপনার উদাহরণ ফাঁকা জায়গায় থাকা স্ট্রিংগুলিতে কাজ করবে না। "উদাহরণস্বরূপ, এটির জন্য একটি" হয়ে উঠবে "," উদাহরণস্বরূপ "," একটি "। এটি একটি বিএডি সমাধান না বলে (এটি আমার উদাহরণের উপর পুরোপুরি কাজ করে) এটি কেবল হাতের কাজটির উপর নির্ভর করে!
মিঃ_চিম্প

হ্যাঁ, এটা খুব সঠিক! আপনি সম্ভবত রেজিপ্সকে সামঞ্জস্য করতে পারেন যাতে এটি স্পেসগুলির সাথে স্ট্রিংগুলি পরিচালনা করতে পারে তবে তালিকাটি বোঝার সাথে যদি কাজ করে তবে আমি এটির সাথে লেগে থাকব;)
ব্র্যাড মন্টগোমেরি

2
import re
result=[x for x in re.split(',| ',your_string) if x!='']

এটা আমার জন্য ভাল কাজ করে।


2

re (নিয়মিত এক্সপ্রেশন হিসাবে) একসাথে একাধিক অক্ষরে বিভক্ত করতে দেয়:

$ string = "blah, lots  ,  of ,  spaces, here "
$ re.split(', ',string)
['blah', 'lots  ', ' of ', ' spaces', 'here ']

এটি আপনার উদাহরণের স্ট্রিংয়ের জন্য ভাল কাজ করে না, তবে কমা-স্থান বিচ্ছিন্ন তালিকার জন্য দুর্দান্তভাবে কাজ করে। আপনার উদাহরণস্বরূপ স্ট্রিংয়ের জন্য, আপনি "স্প্লিট-অন-এই-বা-সেই" প্রভাব পেতে রেগেক্স প্যাটার্নগুলিতে বিভক্ত করতে পুনরায় স্প্লিট পাওয়ারকে একত্রিত করতে পারেন ।

$ re.split('[, ]',string)
['blah',
 '',
 'lots',
 '',
 '',
 '',
 '',
 'of',
 '',
 '',
 '',
 'spaces',
 '',
 'here',
 '']

দুর্ভাগ্যক্রমে, এটি কুৎসিত, তবে একটি filterকৌশলটি করবে:

$ filter(None, re.split('[, ]',string))
['blah', 'lots', 'of', 'spaces', 'here']

ভাল খবর!


2
শুধু কেন নয় re.split(' *, *', string)?
পল টমলিন

4
@ পলটম্বলিন ভাল ধারণা। re.split('[, ]*',string)একই প্রভাবের জন্য কেউ এটিও করতে পারে।
ড্যানিড

ড্যানিড আমি লেখার পরে বুঝতে পেরেছিলাম যে এটি শুরুতে এবং সাদা অংশটি @ tbc0 এর উত্তর মতো পছন্দ করে না wh
পল টমলিন

@ পলটমব্লিনেহে, এবং আমার প্রত্যাখ্যান [, ]*তালিকাটির শেষে একটি খালি স্ট্রিং ফেলেছে । আমার মনে হয় ফিল্টারটি সেখানে ফেলে দেওয়া এখনও একটি দুর্দান্ত জিনিস, বা শীর্ষ উত্তরগুলির মতো বোধগম্যতার তালিকা বদ্ধ করা।
ড্যানিড

1

map(lambda s: s.strip(), mylist)স্পষ্টভাবে লুপিংয়ের চেয়ে কিছুটা ভাল হবে। বা পুরো জিনিস একবারে:map(lambda s:s.strip(), string.split(','))


10
টিপ: যে কোনও সময় আপনি নিজেকে ব্যবহার করার সময় খুঁজে পান map, বিশেষত যদি আপনি এটি ব্যবহার করে থাকেন lambdaতবে আপনাকে তালিকা বোঝার জন্য ব্যবহার করা উচিত কিনা তা ডাবল-পরীক্ষা করে দেখুন।
গ্লেন মেইনার্ড

11
আপনি ল্যাম্বদা সঙ্গে এড়াতে পারেন map(str.strip, s.split(','))
জেসন ওরেডরফ


1
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)]

সহজভাবে, কমা বা কমপক্ষে একটি সাদা স্পেস পূর্ববর্তী / ছাড়াই / সাদা জায়গা সাফল্যের সাথে with

চেষ্টা করুন!


0

map(lambda s: s.strip(), mylist)স্পষ্টভাবে লুপিংয়ের চেয়ে কিছুটা ভাল হবে।
বা পুরো জিনিস একবারে:

map(lambda s:s.strip(), string.split(','))

মূলত আপনার যা প্রয়োজন তা হ'ল।

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