Python生成匹配对

2024-05-15 00:21:10 发布

您现在位置: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'))]

如何重写代码以获得所需的结果


Tags: namesmycountwikilinepopdigdigits
2条回答

试试这个

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

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'))]

这是基于您的假设:

that's always two names and then 2,3 or 4 lines with numbers

相关问题 更多 >

    热门问题