如何通过检查python列表是否与给定模式匹配来对其排序?

2024-06-03 08:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

对不起我的英语。你知道吗

我正在用python编写一个tkinter程序,但我一直坚持对列表进行排序。我来解释一下。你知道吗

我想构建一个函数,该函数将字符串的(用户输入)列表作为参数,并根据它们的元素是否匹配某个字典键,以不同的顺序返回相同的列表。你知道吗

我把每把钥匙的顺序都写进字典里了。你知道吗

dic=dict(organiza=1,autor=1,direct=1,docen=1,exp=1,dirig=1,ponen=1,fecha=2,día=2,dia=2,cuándo=2,cuando=2,lugar=3,sitio=3,locali=3,situa=3,direcci=3,ubica=3,web=4,link=4,enlace=4,página=4,pagina=4)

我想要这样,如果我拿起一个清单,比如:

    lis=['TITLE:BLAH,BLAH..', 'web: www.something.es', 'situación: UCM University', 'Director: Someone', 'Fecha: some date']

输出应为:

    ['TITLE:BLAH,BLAH..','Director: Someone', 'Fecha: some date', 'situación: UCM University' 'web: www.something.es']

也就是说,我想要的顺序是“标题(这是有史以来的第一个,没有改变),导演,Fecha,Situación,Web”或者它们的意思变体。你知道吗

因为程序必须检查列表并与dict键进行比较,按dict值对其进行排序。 如您所见,没有必要将每个单词字符串作为一个整体进行匹配,如果单词的某个部分匹配“:”之前的某个键,则排序时必须将其考虑在内。你知道吗

    texto=self.master.clipboard_get() #obtenemos un string del clipboard
    texto=texto.split('\n') #separamos cada parrafo en una entrada de una lista
    texto=list(map(str.strip,texto)) #eliminamos posibles espacios iniciales y finales en cada entrada
    N=len(texto) #medimos su longitud
    x=[] #inicializamos la lista de items no deseados
    for i in range(N): #recorremos cada elemento de la lista
        n=len(texto[i]) #longitud del elemento en cuestion
        check=texto[i]==' '*n #si el elemento es solo espacio en blanco
        if check==True:
            x.append(texto[i]) #añadimos el item no deseado
    texto = [e for e in texto if e not in x] #con esto ya tenemos la lista con las entradas a poner en los campos
    N=len(texto) #volvemos a medir su longitud
    if N>5:
        return messagebox.showerror("Atención", "El texto que desea pegar tiene más de 5 líneas. El número de campos debe ser compatible con las celdas que se desea rellenar.")
    elif N<5: #si es menor que 5 completamos campos con entradas vacias
        while len(texto)<5:
            texto.append('')
    dic=dict(organiza=1,autor=1,direct=1,docen=1,exp=1,dirig=1,ponen=1,fecha=2,día=2,dia=2,cuándo=2,cuando=2,lugar=3,sitio=3,locali=3,situa=3,direcci=3,ubica=3,web=4,link=4,enlace=4,página=4,pagina=4)#diccionario con el orden de las claves
    new_order=[i for i in range(5)] #lista que llevara los nuevos ordenes de texto
    iteracion=itertools.product(range(1,N), dic.keys())
    for i, j in iteracion: #un loop es sobre el vector texto y otro sobre las claves del diccionario
        if texto[i].lower().find(j,0,texto[i].find(':'))!=-1: #si en alguna entrada del vector texto encuentra alguna clave j antes de los :
            new_order[i]=dic[j] #en el vector de nuevas posiciones asignamos la que nos dice el diccionario
    texto=[x for _,x in sorted(zip(new_order,texto))]
    self.var_entry_titulo.set(texto[0])
    self.var_entry_director.set(texto[1][texto[1].find(':')+1:].strip())
    self.var_entry_fecha.set(texto[2][texto[2].find(':')+1:].strip())
    self.var_entry_lugar.set(texto[3][texto[3].find(':')+1:].strip())
    self.var_entry_web.set(texto[4][texto[4].find(':')+1:].strip())
    print(texto,new_order)

上面的代码根本不起作用。我试过很多次,但都失败了。你知道吗

谢谢大家,我希望你们理解我要解释的,但我知道这是一个非常糟糕的论证


Tags: inselfwebforesvardefind
3条回答

您需要创建一个排序键,以便按“:”后面的值进行排序。“sort\u key”函数返回“:”之后的字符串,这将是排序的参数。你知道吗

lis=['TITLE: BLAH,BLAH..', 'web: www.something.es', 'situación: UCM University', 'Director: Someone', 'Fecha: some date']
def sort_key(elem):
    return elem.split(': ')[1]
print(sorted(lis,key=sort_key))

在这里您可以尝试:

dic=dict(organiza=1,autor=1,direct=1,docen=1,exp=1,dirig=1,ponen=1,fecha=2,día=2,dia=2,cuándo=2,cuando=2,lugar=3,sitio=3,locali=3,situa=3,direcci=3,ubica=3,web=4,link=4,enlace=4,página=4,pagina=4)
lis = ['TITLE:BLAH,BLAH..', 'web: www.something.es', 'situación: UCM University', 'Director: Someone',
   'Fecha: some date']
li = [[] for i in range(len(lis))]
li[0].append(lis[0])
for x in lis:
    for j in dic.keys():
        if j in x.split(':')[0].lower():
            li[dic[j]].append(x)

print(sum(li,[]))
# ['TITLE:BLAH,BLAH..', 'Director: Someone', 'Fecha: some date', 'situación: UCM University', 'web: www.something.es']

问题中的字典缺少“title”的键,该键的值应为零,因为它位于第一位。另外,在调用sorted过程时,应该使用key参数,这样可以大大简化问题。我的建议是:

import re

# this is the preferred syntax for creating a dictionary
dic = {'title':0,'organiza':1,'autor':1,'direct':1,'docen':1,'exp':1,'dirig':1,'ponen':1,'fecha':2,'día':2,'dia':2,'cuándo':2,'cuando':2,'lugar':3,'sitio':3,'locali':3,'situa':3,'direcci':3,'ubica':3,'web':4,'link':4,'enlace':4,'página':4,'pagina':4}

def rank(ele):
    # split each element in words
    ele = ele.lower()
    words = re.split(r'[: ]+', ele)
    # check each word to see if it's a
    # substring of one of the dictionary keys
    for w in words:
        for word, value in dic.items():
            if word in w:
                # return first match
                return value
    # if no match is found, send word to the end
    return float('+inf')

它工作正常:

lis = ['TITLE:BLAH,BLAH..', 'web: www.something.es', 'situación: UCM University', 'Director: Someone', 'Fecha: some date']
sorted(lis, key=rank)
=> ['TITLE:BLAH,BLAH..', 'Director: Someone', 'Fecha: some date', 'situación: UCM University', 'web: www.something.es']

相关问题 更多 >