【问题标题】:Python output orderingPython 输出排序
【发布时间】:2020-05-07 21:17:45
【问题描述】:

我已经设置了我的代码,因此它获取了一个 API 并将某些变量输出到一个 .txt 文件中,但我希望它不按字母顺序或任何其他方式排序,而是按优先级顺序,所以如果其中一个变量是 MVP,它会作为 VIP 放在 .txt 的更高位置,80 将高于 20 这是.txt的一个例子

b-88698@alt.com : thegiant20** [10]
e-b77b2@alt.com : Rancher** [1] [VIP]
5-c1eb6@alt.com : dogdad** [4] [VIP]
1-15a1f@alt.com : mb1mi** [0]
5-cd91b@alt.com : shalexa** [18] [MVP_PLUS]

但我想订购它,所以它是这样的

5-cd91b@alt.com : shalexa** [18] [MVP_PLUS]
5-c1eb6@alt.com : dogdad** [4] [VIP]
e-b77b2@alt.com : Rancher** [1] [VIP]
b-88698@alt.com : thegiant20** [10]
1-15a1f@alt.com : mb1mi** [0]

有什么我可以放入的东西可以轻松实现吗?

【问题讨论】:

  • 所以首先MVP_PLUS>MVP>other 并在每个看括号之间的数字? 80 和 20 是什么?
  • 它将是 MVP_PLUS 和 80 > MVP_PLUS 和 20 > MVP > VIP_PLUS > VIP > 80 > 50 > 10 > 0,其中单个数字不是 mvp 或 vip

标签: python list sorting output


【解决方案1】:

listsort 方法有一个key 参数,您可以在其中提供一个确定排序顺序的函数。这个函数必须找到它是MVP还是VIP,并且它必须找到方括号中的值。

import re

def main():
    lines = [
        'b-88698@alt.com : thegiant20** [10]',
        'e-b77b2@alt.com : Rancher** [1] [VIP]',
        '5-c1eb6@alt.com : dogdad** [4] [VIP]',
        '1-15a1f@alt.com : mb1mi** [0]',
        '5-cd91b@alt.com : shalexa** [18] [MVP_PLUS]',
    ]

def sortkey(value):
    is_mvp = '[MVP' in value
    is_vip = '[VIP' in value
    group = re.search(r'\[(\d+)\]', value)
    number = int(group[1])
    return is_mvp, is_vip, number

    lines.sort(key=sortkey, reverse=True)
    for line in lines:
        print(line)


if __name__ == '__main__':
    main()

比较是用一个元组完成的。第一个值表示我们是否有 MVP。相应的值为TrueFalse(或视为整数10)。对于 VIP,第二个值是相同的。最后一个值是括号中的数字转换为整数。

结果

5-cd91b@alt.com : shalexa** [18] [MVP_PLUS]
5-c1eb6@alt.com : dogdad** [4] [VIP]
e-b77b2@alt.com : Rancher** [1] [VIP]
b-88698@alt.com : thegiant20** [10]
1-15a1f@alt.com : mb1mi** [0]

return 之前的sortkey 函数中添加以下行,您将看到为其生成并用于排序的值和键。

    print(f'{value} -> key ({int(is_mvp)}, {int(is_vip)}, {number})')

输出

b-88698@alt.com : thegiant20** [10] -> key (0, 0, 10)
e-b77b2@alt.com : Rancher** [1] [VIP] -> key (0, 1, 1)
5-c1eb6@alt.com : dogdad** [4] [VIP] -> key (0, 1, 4)
1-15a1f@alt.com : mb1mi** [0] -> key (0, 0, 0)
5-cd91b@alt.com : shalexa** [18] [MVP_PLUS] -> key (1, 0, 18)

【讨论】:

  • 你能改变这个,让它接受 output.txt 文件并命令 .txt 然后覆盖它吗?
  • 如果您不知道如何读写文件,我建议您查看“Reading and Writing Files”一章中的教程。如果您研究过它并且仍然有问题,那么请提出一个新问题。对于这个问题,这变得非常广泛。请记住您在此处注册时接受的规则:此站点是针对一个实际问题的问答,而不是完整的架构解决方案。
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2016-08-16
相关资源
最近更新 更多