Il y a tellement de problèmes avec votre code que d'autres l'ont mentionné. Je vais essayer d'expliquer comment j'implémenterais cette fonction.
Il semble que ce que vous voulez faire est réellement ceci: Vous générez une liste de paires à partir des séquences d'entrée et voyez s'il y a des doublons parmi les paires. Lorsque vous formulez le problème de cette manière, il devient beaucoup plus facile à implémenter.
Nous devons d'abord générer les paires.Il peut être fait à bien des égards, celui que vous auriez probablement faire est:
def pairs(seq):
ret = []
# go to the 2nd last item of seq
for k in range(len(seq)-1):
# append a pair
ret.append((seq[k], seq[k+1]))
return ret
Maintenant, nous voulons voir (a, b) et (b, a) et le même tuple, donc nous trions tout simplement les tuples :
def sorted_pairs(seq):
ret = []
for k in range(len(seq)-1):
x,y = (seq[k], seq[k+1])
if x <= y:
ret.append((x,y))
else:
ret.append((y,x))
return ret
Maintenant, la résolution du problème est assez simple. Nous avons juste besoin de générer tous ces tuples et de les ajouter à un ensemble. Une fois que nous voyons une paire deux fois nous avons terminé:
def has_common_pairs(*seqs):
""" checks if there are any common pairs among any of the seqs """
# store all the pairs we've seen
seen = set()
for seq in seqs:
# generate pairs for each seq in seqs
pair_seq = sorted_pairs(seq)
for pair in pair_seq:
# have we seen the pair before?
if pair in seen:
return True
seen.add(pair)
return False
maintenant la fonction que vous essayez de mettre en œuvre est assez simple:
def check(xxr):
return not has_common_pairs(*xxr)
PS: Vous pouvez généraliser les sorted_pairs fonctionnent à travailler sur tout type de itérable, pas seulement ceux qui supportent l'indexation. Par souci d'exhaustivité je vais le coller ci-dessous, mais vous n'en avez pas vraiment besoin ici et il est plus difficile à comprendre:
def sorted_pairs(seq):
""" yield pairs (fst, snd) generated from seq
where fst <= snd for all fst, snd"""
it = iter(seq)
fst = next(it)
for snd in it:
if first <= snd:
yield fst, snd
else:
yield snd, fst
first = snd
Vous êtes encore confusion des tuples et des listes. En outre, "ne semble pas fonctionner correctement" est un rapport de bogue 100% sans valeur - quels résultats obtenez-vous, qu'attendez-vous? – delnan
@delnan Je pense que le résultat escompté est décrit dans la doc-chaîne, mais je suis d'accord sur "liste/tuple encore confus" :) – khachik
La docstring est trompeuse aussi, si la fonction cherche des paires communes (si paires signifie ce que vous 'd attendent, c'est à dire 'paires ([1,2,3,4]) -> [(1,2), (2,3), (3,4)]') alors il ne peut y avoir de 'trié' dans Là. Voir ce qui se passe avec '[1,2,3,4] vs [1,3,5,2]' –