对不起我的英语。你知道吗
我正在用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)
上面的代码根本不起作用。我试过很多次,但都失败了。你知道吗
谢谢大家,我希望你们理解我要解释的,但我知道这是一个非常糟糕的论证
您需要创建一个排序键,以便按“:”后面的值进行排序。“sort\u key”函数返回“:”之后的字符串,这将是排序的参数。你知道吗
在这里您可以尝试:
问题中的字典缺少“title”的键,该键的值应为零,因为它位于第一位。另外,在调用
sorted
过程时,应该使用key
参数,这样可以大大简化问题。我的建议是:它工作正常:
相关问题 更多 >
编程相关推荐