Python创建匹配对

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python创建匹配对相关的知识,希望对你有一定的参考价值。

我在这样的.txt文件中:

Crista
Jame
7,3
2,0
Wiki
Rok
4,1
6,2
3,2
6,8
Pope
Lokk
5,2
0,1
3,1
Sam
Antony
4,3
9,1

我的代码可查找所有名称并将其附加到names[]列表中,并查找所有数字并将其附加到digits[]列表中(如果一行中有多于两行的数字,则不需要他们在之前的列表中):

import re
f=open('mine.txt')
names=[]
digits=[]
count=0
for line in f:
        line = line.rstrip()
        if re.search('^[a-zA-Z]', line):
                name=line
                names.append(name)
        if re.findall('^d{1}:d{1}', line):
            if count < 2 :
                digit=line
                digits.append(digit)
            count += 1
        elif line != "" :
            count = 0

然后我用成对的名称和数字进行匹配:

  my_pairs_dig=list()
    while(digits):
        a = digits.pop(0); b = digits.pop(0)
        my_pairs_dig.append((a,b))
    my_pairs_dig

    my_pairs_names = list()
    while(names):
        a = names.pop(0); b = names.pop(0)
        my_pairs_names.append((a,b))
    my_pairs_names
    outp=list(zip(my_pairs_names,my_pairs_dig))

并获得此输出:

[(('Crista', 'Jame'), ('7,3', '2,0')), (('Wiki', 'Rok'), ('4,1', '6,2')), (('Pope', 'Lokk'), ('5,2', '0,1')), (('Sam', 'Antony'),('4,3', '9,1'))]

但是计划已更改,现在我想要的输出是:

[(('Crista', 'Jame'), ('7,3', '2,0')), (('Wiki', 'Rok'), ('4,1', '6,2'), ('3,2', '6,8')), (('Pope', 'Lokk'), ('5,2', '0,1'), ('3,1')), (('Sam', 'Antony'),('4,3', '9,1'))]

我如何重写我的代码以获得所需的输出?

答案

尝试一下

with open('test.txt', 'r') as fp:
    data = fp.read().split("
")

i, res = 0, []
while i < len(data):
    if data[i].isalpha():
      names = (data[i], data[i+1])
      i += 2
    digits = []
    while i < len(data) and not data[i].isalpha():
        digits.append(data[i])
        i += 1
    digits = tuple(digits)
    if len(digits) > 2:
        res.append((names, digits[: 2], digits[2: ]))
    else:
        res.append((names, digits[: 2]))
print(res) 

输出:

[(('Crista', 'Jame'), ('7,3', '2,0')), (('Wiki', 'Rok'), ('4,1', '6,2'), ('3,2', '6,8')), (('Pope', 'Lokk'), ('5,2', '0,1'), ('3,1',)), (('Sam', 'Antony'), ('4,3', '9,1'))]
另一答案

尝试一下:

import re
digits=[]
result = []
name1, name2 = None, None
for line in f:
  if line:
        line = line.rstrip()
        if re.search('^[a-zA-Z]', line):          
            if name1 and name2:
                result.append(((name1, name2),  *tuple(tuple(digits[i:i+2]) for i in range(0, len(digits), 2))))
                name1, name2, digits = None, None, []
            if name1: 
                name2 = line
            else: 
                name1 = line
        else:
            digits.append(line)

if name1 and name2:
    result.append(((name1, name2),  *tuple(tuple(digits[i:i+2]) for i in range(0, len(digits), 2))))
    name1, name2, digits = None, None, []

print(result)

输出:

[(('Crista', 'Jame'), ('7,3', '2,0')), (('Wiki', 'Rok'), ('4,1', '6,2'), ('3,2', '6,8')), (('Pope', 'Lokk'), ('5,2', '0,1'), ('3,1',)), (('Sam', 'Antony'), ('4,3', '9,1'))]

这是基于您的假设:

始终是两个名称,然后是2,3或4行带有数字

以上是关于Python创建匹配对的主要内容,如果未能解决你的问题,请参考以下文章

循环通过 python 正则表达式匹配

重新创建应用时,片段与底部导航视图图标不匹配

Python学习笔记之正则表达式

python使用上下文对代码片段进行计时,非装饰器

firebase 的短信代码不匹配

常用python日期日志获取内容循环的代码片段