根据最后一个数字

时间:2016-12-14 14:38:58

标签: python sorting

如果我有一个如下所示的文本文件:

DESERT TROLL STR: 42 DEX: 17 AC: 17
HALF-ORC STR: 19 DEX: 5 AC: 17
EYEBLADE STR: 4 DEX:  20 AC: 12
BLUE DRAGON STR: 40 DEX: 65: AC: 42
SLAVE: NO FIGHTING ABILTIES AC: 1

当我阅读时:

    with open("dndmobs.txt", 'r') as f:

我想基于最后的小怪AC对行进行排序,最低的AC从顶部开始然后增加。

    mobs = re.findall(r'(?<=\AC: ).*',line)

使用正则表达式我创建了一个选择&#34; AC:&#34;之后的所有内容的行。我可以将其用作&#34;标识符&#34;对于这些行然后对它们进行排序?

提前致谢

4 个答案:

答案 0 :(得分:2)

我可能甚至不会使用re,只是split

with open('dndmobs.txt', 'r+') as f:
    f.writelines(sorted(f.readlines(), key=lambda x: int(x.split()[-1]))) 

答案 1 :(得分:0)

这是一个可以完成工作的单线:

'\n'.join(sorted(test.split('\n'), key=lambda x: x.split()[-1])

首先用新行字符分割。现在您有一个包含每一行的列表。然后根据列表中的每个项目对此列表进行排序,在空白处拆分并保留最后一项(您要查找的数字)。最后,我们采用该排序列表并使用新的行字符加入它。希望这有帮助!

答案 2 :(得分:0)

f = """DESERT TROLL STR: 42 DEX: 17 AC: 17
HALF-ORC STR: 19 DEX: 5 AC: 17
EYEBLADE STR: 4 DEX:  20 AC: 12
BLUE DRAGON STR: 40 DEX: 65: AC: 42
SLAVE: NO FIGHTING ABILTIES AC: 1"""

sorted([(int(e.split("AC:")[1]), e) for e in f.split("\n")])

输出

[(1, 'SLAVE: NO FIGHTING ABILTIES AC: 1'),
 (12, 'EYEBLADE STR: 4 DEX:  20 AC: 12'),
 (17, 'DESERT TROLL STR: 42 DEX: 17 AC: 17'),
 (17, 'HALF-ORC STR: 19 DEX: 5 AC: 17'),
 (42, 'BLUE DRAGON STR: 40 DEX: 65: AC: 42')]

答案 3 :(得分:0)

已编辑以容纳AC之间没有空白:和数字

我正在使用CPython 3.5.2

恕我直言,重新模块是不必要的,假设你的文件总是看起来像你的例子。我的意思是&#34; AC:&#34;后面会跟着每行末尾的整数

代码

使用列表理解和已排序()

with open("dndmobs.txt", 'r') as f:
    tuples_list = [(line.strip(), line.strip().split()[-1]) for line in f]

对于中间没有空格的情况&#34; AC:&#34;以及您可以使用re模块的编号

with open("dndmobs.txt", 'r') as f:
    tuples_list = [(line.strip(), re.findall('\d+', line)[-1]) for line in f]

for item in sorted(tuples_list, key=lambda x: x[1]):
    print(item[0])

以上代码将生成以下内容

SLAVE: NO FIGHTING ABILTIES AC: 1
EYEBLADE STR: 4 DEX:  20 AC: 12
DESERT TROLL STR: 42 DEX: 17 AC: 17
HALF-ORC STR: 19 DEX: 5 AC: 17
BLUE DRAGON STR: 40 DEX: 65: AC: 42

详情

使用列表推导来制作元组列表

每个元组包含两个元素
  • 原创
  • &#34; AC之后的整数:&#34;为行
  • 收集&#34; AC之后的整数:&#34;假设空格

  • 删除线路末端的车辆返回(条带)
  • 将行拆分为令牌并将其放入列表(拆分)
  • 选择列表中的最后一个值([-1])

  • 收集&#34; AC之后的整数:&#34;假设没有空格

  • 使用re和findall创建字符串中的数字列表
  • 选择列表中的最后一个值([-1])

  • 使用sorted()对元组列表进行排序

    sorted()函数接收新列表(tuples_list),并使用每个元组的第二个元素(x [1])进行排序。按照您的要求,&#34;最低的AC从顶部开始,然后增加&#34;