如果我有一个如下所示的文本文件:
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;对于这些行然后对它们进行排序?
提前致谢
答案 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;假设没有空格
使用sorted()对元组列表进行排序
sorted()函数接收新列表(tuples_list),并使用每个元组的第二个元素(x [1])进行排序。按照您的要求,&#34;最低的AC从顶部开始,然后增加&#34;