J'ai une liste [T20, T5, T10, T1, T2, T8, T16, T17, T9, T4, T12, T13, T18]
J'ai supprimé les T , converti en type entier et trié la liste pour obtenir ceci:
sorted_ids = [1, 2, 4, 5, 8, 9, 10, 12, 13, 16, 17, 18, 20]
Je fais une boucle sur la liste et je vérifie si le numéro suivant le numéro actuel est dans l'ordre numérique. Sinon, je veux insérer un "V" à sa position.
Donc, finalement, la liste devrait ressembler à: [1, 2, V, 4, 5, V, V, 8, 9, 10, V, 12, 13, V, V, 16, 17, 18, V, 20]
Cependant, je ne parviens pas à insérer le nombre exact de V aux bonnes positions.
def arrange_tickets(tickets_list):
ids=[]
for item in tickets_list:
new_str=item.strip("T")
ids.append(int(new_str))
sorted_ids = sorted(ids)
temp_ids = []
print("Sorted: ",sorted_ids)
#size = len(sorted_ids)
for i in range(len(sorted_ids)-1):
temp_ids.append(sorted_ids[i])
if sorted_ids[i]+1 != sorted_ids[i+1] :
temp_ids.insert(i+1,"V")
print(temp_ids)
#print(sorted_ids)
tickets_list = ['T20', 'T5', 'T10', 'T1', 'T2', 'T8', 'T16', 'T17', 'T9', 'T4', 'T12', 'T13', 'T18']
print("Ticket ids of all the available students :")
print(tickets_list)
result=arrange_tickets(tickets_list)
Résultat réel: [1, 2, 'V', 4, 'V', 5, 8, 'V', 9, 'V', 10, 12, 'V', 13, 16, 17, 18]
Résultat attendu: [T1, T2, V, T4, T5, V, V, T8, T9, T10, V, T12, T13, V, V, T16, T17, T18, V, T20]
8 Réponses :
Voici une solution:
['T1', 'T2', 'V', 'T4', 'T5', 'V', 'V', 'T8', 'T9', 'T10', 'V', 'T12', 'T13', 'V', 'V', 'T16', 'T17', 'T18', 'V', 'T20']
Sortie:
sorted_ids=[1, 2, 4, 5, 8, 9, 10, 12, 13, 16, 17, 18, 20]
def arrange(inList):
newList = []
newList.append('T'+str(inList[0]))
for i in range(1,len(inList)):
diff = inList[i] - inList[i-1]
if diff > 1:
for d in range(diff-1):
newList.append('V')
newList.append('T'+str(inList[i]))
else:
newList.append('T'+str(inList[i]))
return newList
print(arrange(sorted_ids))
Super, j'ai aimé votre logique. Je pense que la principale chose qui manquait à mon code était la boucle interne. Merci. Quoi qu'il en soit, si je voulais rattacher les T aux nombres, quelle devrait être la logique? Faire une boucle et concaténer un «T» à chaque élément?
@HackersInside merci, j'ai mis à jour ma réponse pour l'adapter à votre résultat attendu. Vous pouvez jeter un œil et me dire si ça va.
for i in range(len(sorted_ids)-1):
Pouvez-vous expliquer pourquoi devons-nous ajouter le dernier élément séparément?
Merci beaucoup
Voici une autre solution à considérer:
['T1', 'T2', 'V', 'T4', 'T5', 'V', 'V', 'T8', 'T9', 'T10', 'V', 'T12', 'T13', 'V', 'V', 'T16', 'T17', 'T18', 'V', 'T20']
résultat:
sorted_ids=[1, 2, 4, 5, 8, 9, 10, 12, 13, 16, 17, 18, 20]
for i in range(min(sorted_ids), max(sorted_ids)):
if sorted_ids[i] != i + 1:
sorted_ids.insert(i, 'V')
final_list = [ "T" + str(x) if isinstance(x, int) else x for x in sorted_ids]
euh cela ne semble pas correct: ['T1', 'V', 'T2', ...] vous ne pensez pas?
Voici une liste de compréhension qui vous donne ce que vous voulez:
['T1', 'T2', 'V', 'T4', 'T5', 'V', 'V', 'T8', 'T9', 'T10', 'V', 'T12', 'T13', 'V', 'V', 'T16', 'T17', 'T18', 'V', 'T20']
Sortie:
sorted_ids=[1, 2, 4, 5, 8, 9, 10, 12, 13, 16, 17, 18, 20] a = sorted_ids[0] b = sorted_ids[-1] nums = set(sorted_ids) expected = ["T" + str(i) if i in nums else 'V' for i in range(a,b+1)] print(expected)
Merci, pourriez-vous s'il vous plaît élaborer sur l'utilisation de l'ensemble?
@HackersInside Le but de set est de convertir en d'un opérateur O (n) en un O (1) code > opérateur. Dans ce cas, cela n'a pas vraiment d'importance, mais pour des ensembles de données plus volumineux, il serait inefficace d'avoir plusieurs analyses linéaires sur une liste.
Tout d'abord, considérez quels identifiants devraient figurer dans la liste, en supposant qu'ils commencent par 1 et se terminent par le plus grand présent. Ensuite, vérifiez si chaque identifiant attendu est réellement présent, et sinon mettez un "V" là-bas. Comme effet secondaire, cela trie également la liste.
Ticket ids of all the available students : ['T20', 'T5', 'T10', 'T1', 'T2', 'T8', 'T16', 'T17', 'T9', 'T4', 'T12', 'T13', 'T18'] ['T1', 'T2', 'V', 'T4', 'T5', 'V', 'V', 'T8', 'T9', 'T10', 'V', 'T12', 'T13', 'V', 'V', 'T16', 'T17', 'T18', 'V', 'T20']
résultat:
def arrange_tickets(tickets_list):
ids = [int(ticket[1:]) for ticket in tickets_list]
expected_ids = range(1, max(ids) + 1)
return ["T%d" % n if n in ids else "V" for n in expected_ids]
tickets_list = ['T20', 'T5', 'T10', 'T1', 'T2', 'T8', 'T16', 'T17', 'T9', 'T4', 'T12', 'T13', 'T18']
print("Ticket ids of all the available students :")
print(tickets_list)
result=arrange_tickets(tickets_list)
print(result)
Vous pouvez utiliser cette recette des itertools pour regrouper d'abord les nombres consécutifs :
def add_prefix(lst, prefix):
return [prefix + str(x) for x in lst]
def create_sequences(lst, prefix='T'):
groups = list(groupby_consecutive(lst))
between = list(interperse(groups))
result = add_prefix(groups[0], prefix)
for x, y in zip(between, groups[1:]):
result.extend(x + add_prefix(y, prefix))
return result
sorted_ids = [1, 2, 4, 5, 8, 9, 10, 12, 13, 16, 17, 18, 20]
print(create_sequences(lst=sorted_ids))
# ['T1', 'T2', 'V', 'T4', 'T5', 'V', 'V', 'T8', 'T9', 'T10', 'V', 'T12', 'T13', 'V', 'V', 'T16', 'T17', 'T18', 'V', 'T20']
Ensuite, vous pouvez créer une fonction qui récupère les valeurs V entrecoupées des regroupements précédents:
def interperse(lst):
for x, y in zip(lst, lst[1:]):
yield ["V"] * (y[0] - x[-1] - 1)
groups = list(groupby_consecutive(lst))
print(list(interperse(groups)))
# [['V'], ['V', 'V'], ['V'], ['V', 'V'], ['V']]
Ensuite, vous pouvez enfin compresser le ci-dessus résultats ensemble:
from itertools import groupby
from operator import itemgetter
def groupby_consecutive(lst):
for _, g in groupby(enumerate(lst), lambda x: x[0] - x[1]):
yield list(map(itemgetter(1), g))
sorted_ids = [1, 2, 4, 5, 8, 9, 10, 12, 13, 16, 17, 18, 20]
print(list(groupby_consecutive(lst=sorted_ids)))
# [[1, 2], [4, 5], [8, 9, 10], [12, 13], [16, 17, 18], [20]]
D'un seul coup, directement à partir du tableau d'origine
print(list(add_vs_between_not_cons(array))) #=> ['T1', 'T2', 'V', 'T4', 'T5', 'V', 'V', 'T8', 'T9', 'T10', 'V', 'T12', 'T13', 'V', 'V', 'T16', 'T17', 'T18', 'V', 'T20']
Vous pouvez définir une méthode qui fait tout le travail:
def add_vs_between_not_cons(array):
iterable = sorted(array, key= lambda x: int(x[1:]))
i, size = 0, len(iterable)
while i < size:
delta = int(iterable[i][1:]) - int(iterable[i-1][1:])
for _ in range(delta-1):
yield "V"
yield iterable[i]
i += 1
Donc , vous pouvez appeler:
array = ['T20', 'T5', 'T10', 'T1', 'T2', 'T8', 'T16', 'T17', 'T9', 'T4', 'T12', 'T13', 'T18']
ma solution pour les requêtes infytq:
def arrange_tickets(tickets_list):
ids = [int(ticket[1:]) for ticket in tickets_list]
expected_ids = range(1, max(ids) + 1)
listt=["T%d" % n if n in ids else "V" for n in expected_ids]
list1=listt[0:10]
list2=listt[11:]
for i in range(10):
if 'V' in list2:
list2.remove('V')
for j in range(0,len(list2)):
for n, i in enumerate(list1):
if i == 'V':
list1[n] = list2[j]
j+=1
return list1
tickets_list = ['T5','T7','T1','T2','T8','T15','T17','T19','T6','T12','T13']
print("Ticket ids of all the available students :")
print(tickets_list)
result=arrange_tickets(tickets_list)
print()
print("Ticket ids of the ten students in Group-1:")
print(result[0:10])
pouvez-vous fournir l'exemple de code complet? afin que nous puissions tester cela?
J'ai fourni le code.
Voulez-vous ajouter à nouveau la lettre
Tlorsque l'ensemble du processus est terminé?veuillez vérifier votre mise en forme
Oui, j'ai l'intention d'ajouter le 'T' en retour
La liste commence-t-elle toujours à 1?
oui, la liste commence toujours à 1 (pour l'instant).