如何使用map()函数对列表中的单个单词进行排序



我有一个list of words,我正在尝试在列表中sort

words = ["yo", "act", "flop",'tac']
words = list(map(sorted,words))

Desired outcome: ['oy','act','flop','act']

以上内容将单词中的每个单词拆分为单独的字符,但确实对其进行了排序:

  1. 为什么要这样做?因为我们只是在分类
  2. 我如何重新加入它们,使它们再次成为单词而不是单个字符?我知道它使用的是"".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)),但现在您要在序列上迭代两次(或者更确切地说,在一个序列上迭代,然后在第二个中间序列上迭代(。

如果它还没有名称,则需要定义要映射到列表上的函数。

可以使用deflambda定义函数。

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']

最新更新