3

使用 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'],这是正确的,但是否有更 Pythonic 的方式来回答这个问题,可能使用 list comprehensions/ set

当我尝试结合列表理解嵌套和过滤时,我得到列表列表而不是平面列表。

最终列表 ( ) 中不同字母的顺序ltr并不重要;重要的是它们是独一无二的。

4

7 回答 7

13

套装提供了一种简单、高效的解决方案。

words = 'She sells seashells by the seashore'

unique_letters = set(words.lower())
unique_letters.discard(' ') # If there was a space, remove it.
于 2010-02-11T16:53:04.800 回答
3
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 != ' '))
于 2010-02-11T16:31:51.433 回答
3

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])
于 2010-02-11T16:32:04.430 回答
2
>>> set('她在海边卖贝壳'.replace(' ', '').lower())
设置(['a','b','e','h','l','o','s','r','t','y'])
>>> set(c.lower() for c in '她在海边卖贝壳' if not c.isspace())
设置(['a','b','e','h','l','o','s','r','t','y'])
>>> 从 itertools 导入链
>>> set(chain(*'她在海边卖贝壳'.lower().split()))
设置(['a','b','e','h','l','o','s','r','t','y'])
于 2010-02-11T16:43:37.473 回答
2

以下是使用 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
于 2010-02-11T16:44:23.167 回答
0
set(l for w in word_list for l in w)
于 2010-02-11T16:35:07.330 回答
0
words = 'She sells seashells by the seashore'

ltr = list(set(list(words.lower())))
ltr.remove(' ')
print ltr
于 2010-02-11T17:01:01.773 回答