给定两个字符串,如何将较短的字符串赋值给一个变量,将较长的字符串赋值给另一个变量?

4
我正在学习Python,想知道是否有符合Python风格的方法来完成这个任务。当然我能够做一个

,但是我想了解一下更好的实践方法。
if len(a) > len(b) :
  (x,y) = (b,a)

等等。但这似乎有点啰嗦。在 Python 中有更加优美的方式吗?


@user3483203 需要按长度排序。 - Can't Tell
3
如果您正在寻找一个巧妙的方法来进行分类,但您现在的做法已经完全足够。 - user3483203
1
@user3483203,但我需要else等等。我觉得有点啰嗦。你知道为什么人们像地狱一样对此进行了负投票吗? :D - Can't Tell
@Can'tTell 我认为这些踩的操作是一种“我认为这主要是基于观点,但不值得标记”的表现,即使我认为这是一个有趣的问题。顺便说一下,你实际上有一个积极的分数! - Gsk
7个回答

6

排序似乎有点过度了。你只需要使用if就可以在一行中完成。

x,y = (a,b) if len(a) < len(b) else (b,a)

谢谢你的回答。更详细地解释一下,让我感到困扰的并不是长度,而是表达如此简单事物的冗长。 - Can't Tell
1
@MBo,我在标题中写了。在代码中我没有写,但我说了“等等”。我太懒了,没写else部分。 - Can't Tell
好的,我撤回我的评论。但是作者应该更加小心 :) - MBo

2
x = min(a, b, key=len)
y = max(a, b, key=len)

重复,但意图明确。

编辑:

移除括号,因为minmax可以接受可变数量的参数而不需要将ab转换为元组。


1
使用多重赋值与 sort 结合会更好。这样你只需要运行一次比较。 - Ma0
我认为这是实现标题中所述内容最具表现力的方式。 "将较短的分配给一个变量,将较长的分配给另一个变量"。这里的任务不是处理超过2个变量,而是分两步完成更有意义。 - Frederik.L
@Ev.Kounis 我同意排序方法更优雅地适用于更大的集合。就性能而言,由于集合很小,我不确定是否会有显着的差异。被接受的解决方案本质上是对两个项目进行排序的特殊情况,并且根据个人喜好,更易读。我的意图是提供一种替代方案。 - lightalchemist

1
发现了一种方法。
(x,y) = sorted([a,b], key = len)

2
我更喜欢你最初的方式。 - khelwood
2
不要陷入一行代码的迷思中,你的代码现在已经非常易读了。 - user3483203
2
如果行数会影响代码的美观程度,那么你应该定义一下你所说的“美观”。 - Gsk
1
@Gsk 我并不是说这是一个普遍规则,但我觉得原始代码似乎不太符合 Python 的风格。你可以看一下 khelwood 的回答,那才是我想表达的意思。 - Can't Tell
1
你有测量执行时间吗?使用if比使用sorted所需的时间更短。(即,在我的机器上使用if需要0.007247173540780684,而使用sorted需要0.012815168972169048 - Abdul Niyas P M
显示剩余2条评论

1
使用 min(n1, n2, n3, ...)
>>> n1 = "abcdefghijkl"
>>> n2 = "abc"
>>> min((n1,n2), key=len)
'abc'
>>> max((n1,n2), key=len)
'abcdefghijkl'

2
min('111', '0000') will return '0000'. This doesn't do what you think it does. You can however give len as a key to min - user3483203
@user3483203 谢谢,已经修复了! - Jagjeet Singh

1
你可以使用序列解包与min / max。这仍然是O(n)复杂度,虽然是一个两遍的解决方案,但不涉及创建中间字符串的listtuple
a = 'hello'
b = 'test'

x, y = (func(a, b, key=len) for func in (min, max))

print(x, y, sep='\n')

# test
# hello

Here's a functional version:

from operator import methodcaller

x, y = map(methodcaller('__call__', a, b, key=len), (min, max))

这里有很多 Python 风格的代码。 - Frederik.L

1
这个问题似乎非常基于观点,因此我认为我们应该参考Python之禅来定义,特别是以下几点:

扁平比嵌套好。
稀疏比密集好。
可读性很重要。

出于这些原因,我认为你的做法:
if len(a) > len(b) :
    (x,y) = (b,a)
else:
    (x,y) = (a,b)

最好的


1
只是一个演示如何使用字典的例子。
解决方案1:
a = [3]
b = [2,3 ]

_bool = len(a)<len(b)

d = { True : a, False : b}

x = d[_bool]
y = d[not _bool]


print(x, y)

使用列表:
解决方案2:
x, y = [[a, b], [b, a]][len(a) > len(b)]

尽管我更倾向于的方法是:
x, y = sorted([a, b], key=len)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接