我有一个list of words
,我正在尝试在列表中sort
:
words = ["yo", "act", "flop",'tac']
words = list(map(sorted,words))
Desired outcome: ['oy','act','flop','act']
以上内容将单词中的每个单词拆分为单独的字符,但确实对其进行了排序:
- 为什么要这样做?因为我们只是在分类
- 我如何重新加入它们,使它们再次成为单词而不是单个字符?我知道它使用的是
"".join()
,但我似乎无法将其包裹在上面
谢谢!
sorted
处理任意可迭代值,但总是返回一个列表,而不是它刚刚排序的可迭代值。
>>> sorted("yo")
['o', 'y']
这意味着你必须把排序后的列表自己变成一个字符串。
>>> [''.join(sorted(x)) for x in words]
['oy', 'act', 'flop', 'act']
你仍然可以使用map
,但它比仅仅使用列表理解有点混乱:
>>> list(map(lambda x: ''.join(sorted(x)), words))
['oy', 'act', 'flop', 'act']
因为Python本身不支持函数组合,所以无法编写像这样简洁(可能更高效(的东西
list(map(''.join ∘ sorted, words))
(其中∘
是一个行为类似的假设运算符
(f ∘ g) == lambda x: f(g(x))
)
组合总是涉及创建一个需要调用的附加函数,以便调用原始的两个函数,而不是创建一个单独的函数,该函数与原始的两个子函数执行相同的操作。
另一种选择(list(map(''.join, map(sorted, words)))
(也好不到哪里去;尽管map(f∘g, x)
在效果上通常等同于map(f, map(g, x))
,但现在您要在序列上迭代两次(或者更确切地说,在一个序列上迭代,然后在第二个中间序列上迭代(。
如果它还没有名称,则需要定义要映射到列表上的函数。
可以使用def
或lambda
定义函数。
words = ["yo", "act", "flop",'tac']
def f(w):
return ''.join(sorted(w))
print( list(map(f, words)) )
# ['oy', 'act', 'flop', 'act']
print( list(map(lambda w: ''.join(sorted(w)), words)) )
# ['oy', 'act', 'flop', 'act']
您也可以在映射函数调用中使用join:
words = list(map(lambda x: "".join(sorted(x)),words))
print(words)
>>> ['oy', 'act', 'flop', 'act']