比较两个字符串时,Python max()函数不会给出正确的结果

2024-05-02 02:48:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python还不熟悉。手头的任务是在特定目录中的生成列表中查找最新的生成。你知道吗

我的代码如下所示:

    command = 'ls ' + self.build_path
    stdin, stdout, stderr = self.ssh.exec_command(command)
    builds_list = stdout.read()

    arrBuild = builds_list.split('\n')
    joined = "|".join(arrBuild)
    self.latest_packages['relayws'] = max(re.findall("mybuild-relayws_[0-9]+.[0-9].[0-9]+-[0-9]_amd64.deb", joined))

现在我的问题是,“mybuild-relayws\u 44.0.99-1\u amd64.deb”总是被认为是最新的,因为我的列表中有“mybuild-relayws\u 44.0.101-1\u amd64.deb”。你知道吗

即:

max(['mybuild-relayws_44.0.99-1_amd64.deb', 'mybuild-relayws_44.0.101-1_amd64.deb'])总是返回mybuild-relayws_44.0.99-1_amd64.deb.

我知道max()在这里使用字符串比较,从这个意义上说,它返回的是正确的。但是,在我的例子中,我期望mybuild-relayws\u 44.0.101-1\u amd64.deb

我的问题是:

  1. 如何更改上面代码中返回mybuild-relayws\u 44.0.101-1\u amd64.deb的max()函数
  2. key=lambda in max函数在这里有用吗?如果是,如何将其应用于此代码。你知道吗

提前谢谢。你知道吗


Tags: 函数代码self列表stdoutdebmaxamd64
2条回答

您还没有给出任何有关如何对生成进行排序的规则。我假设您希望根据以下条件订购:

  • firebet-relayws_44.0.99-1_amd64.deb=>;44.0.99-1
  • 然后44.0.99-1=>;一个数字序列(44, 0, 99, 1)
  • 我们是按顺序订购的。你知道吗

然后尝试以下方法:

def get_version(txt):
   # extract eg 44.0.99-1
   version_data = txt.split("_")[1]

   # split into 44.0.99 and 1
   version, release = version_data.split("-")

   # convert them to a list of numbers
   return [int(x) for x in version.split(".")] + [int(release)]

例如:

>>> print(get_version("firebet-relayws_44.0.99-1_amd64.deb"))
[44, 0, 99, 1]

现在我们把它作为键函数传递给max

>>> print(max(['mybuild-relayws_44.0.99-1_amd64.deb', 'mybuild-relayws_44.0.101-1_amd64.deb'], key=get_version))
mybuild-relayws_44.0.101-1_amd64.deb

您需要从relayws获取版本:

def version(relayws):
    return map(int, relayws.split('_')[1].replace('-', '.').split('.'))

然后您可以通过键找到最大值:

latest = max(builds, key=version)

相关问题 更多 >