كيفية الذهاب من قائمة الكلمات إلى قائمة الأحرف المميزة في بيثون
-
20-09-2019 - |
سؤال
باستخدام Python، أحاول تحويل جملة من الكلمات إلى قائمة مسطحة بجميع الأحرف المميزة في هذه الجملة.
إليك الرمز الحالي الخاص بي:
words = 'She sells seashells by the seashore'
ltr = []
# Convert the string that is "words" to a list of its component words
word_list = [x.strip().lower() for x in words.split(' ')]
# Now convert the list of component words to a distinct list of
# all letters encountered.
for word in word_list:
for c in word:
if c not in ltr:
ltr.append(c)
print ltr
إرجاع هذا الرمز ['s', 'h', 'e', 'l', 'a', 'b', 'y', 't', 'o', 'r']
, ، وهو الصحيح، ولكن هل هناك طريقة أكثر ثباتا لهذا الجواب، ربما تستخدم قائمة الفهم /set
?
عندما أحاول الجمع بين التعشيش والتصوير الفهم، أحصل على قوائم القوائم بدلا من قائمة مسطحة.
ترتيب الرسائل المميزة في القائمة النهائية (ltr
) ليست مهمة ما هو حاسم هو أنها فريدة من نوعها.
المحلول
مجموعات توفر حل بسيط وكفء.
words = 'She sells seashells by the seashore'
unique_letters = set(words.lower())
unique_letters.discard(' ') # If there was a space, remove it.
نصائح أخرى
يصنع ltr
مجموعة وتغيير هيئة الحلقة الخاصة بك قليلا:
ltr = set()
for word in word_list:
for c in word:
ltr.add(c)
أو باستخدام فهم قائمة:
ltr = set([c for word in word_list for c in word])
set([letter.lower() for letter in words if letter != ' '])
تعديل: لقد جربته ووجدت ذلك، وسوف يعمل أيضا (ربما هذا ما كان عليه أن silentghost كان يشير إلى):
set(letter.lower() for letter in words if letter != ' ')
وإذا كنت بحاجة إلى الحصول على قائمة بدلا من مجموعة، يمكنك
list(set(letter.lower() for letter in words if letter != ' '))
>>> Set ( 'o'، 's'، 'r'، 't'، 'y']) >>> تعيين (C.Lower () ل C في "إنها تبيع الصدف بواسطة شاطئ البحر" إن لم يكن c.isspace ()) تعيين (['a'، 'b'، 'e'، 'h'، 'l'، 'o'، 's'، 'r'، 't'، 'y']) >>> من Itertools استيراد سلسلة >>> مجموعة (سلسلة (* "تبيع الصدف من قبل seashore'.lower (). انقسام ()) تعيين (['A'، 'B'، 'E'، 'H'، 'o'، 's'، 'r'، 't'، 'y'])
فيما يلي بعض التوقيت المصنوع من PY3K:
>>> import timeit
>>> def t(): # mine (see history)
a = {i.lower() for i in words}
a.discard(' ')
return a
>>> timeit.timeit(t)
7.993071812372081
>>> def b(): # danben
return set(letter.lower() for letter in words if letter != ' ')
>>> timeit.timeit(b)
9.982847967921138
>>> def c(): # ephemient in comment
return {i.lower() for i in words if i != ' '}
>>> timeit.timeit(c)
8.241267610375516
>>> def d(): #Mike Graham
a = set(words.lower())
a.discard(' ')
return a
>>> timeit.timeit(d)
2.7693045186082372
set(l for w in word_list for l in w)
words = 'She sells seashells by the seashore'
ltr = list(set(list(words.lower())))
ltr.remove(' ')
print ltr