ValueError: max() arg est une séquence vide
J'ai créé une interface graphique à l'aide de wxFormBuilder qui devrait permettre à un utilisateur d'entrer le nom de "visiteurs" dans la liste puis cliquez sur l'un des deux boutons de retour les plus fréquentes et les moins fréquents visiteurs de l'entreprise.
J'ai créé une version antérieure qui, malheureusement, m'a donné le nombre de visiteurs, plutôt que le nom de la plus/moins visiteur fréquent. J'ai joint une capture d'écran de l'interface graphique, j'ai créé pour vous aider à ajouter un peu de clarté à la question ( http://imgur.com/XJnvo0U ).
Une nouvelle version du code de prend une approche différente de la version antérieure, et je n'arrive pas à jeter quoi que ce soit. Au lieu de cela, je reçois cette erreur:
ValueError: max() arg est une séquence vide
Par rapport à cette ligne:
auto.txtResults.Valeur = k.index(max(v))
import wx
import myLoopGUI
import commands
class MyLoopFrame(myLoopGUI.MyFrame1):
def __init__(self, parent):
myLoopGUI.MyFrame1.__init__(self, parent)
def clkAddData(self,parent):
if len(self.txtAddData.Value) != 0:
try:
myname = str(self.txtAddData.Value)
self.listMyData.Append(str(myname))
except:
wx.MessageBox("This has to be a name!")
else:
wx.MessageBox("This can't be empty")
def clkFindMost(self, parent):
self.listMyData = []
unique_names = set(self.listMyData)
frequencies = {}
for name in unique_names:
if frequencies.get[name]:
frequencies[name] += 1
else:
frequencies[name] = 0
v = list(frequencies.values())
k = list(frequencies.keys())
self.txtResults.Value = k.index(max(v))
def clkFindLeast(self, parent):
unique_names = set(self.listMyData)
frequencies = {}
for name in unique_names:
if frequencies.get(name):
frequencies[name] += 1
else:
frequencies[name] = 0
v = list(frequencies.values())
k = list(frequencies.keys())
self.txtResults.Value = k.index(min(v))
myApp = wx.App(False)
myFrame = MyLoopFrame(None)
myFrame.Show()
myApp.MainLoop()
len(v) == 0
, dans clkFindMost
, max(v)
soulève ValueError
.ce type d'erreur arrive lorsque vous passez à la liste vide dans (max). Afin de vérifier si la liste est disponible que pour le passer à la max
OriginalL'auteur J'onn J'onzz | 2014-10-01
Vous devez vous connecter pour publier un commentaire.
Puisque vous êtes toujours en cours d'initialisation
self.listMyData
à une liste vide dansclkFindMost
votre code sera toujours conduit à cette erreur* parce que, après que les deuxunique_names
etfrequencies
sont vides iterables, afin de résoudre ce problème.Une autre chose est que, puisque vous êtes une itération sur un ensemble dans cette méthode, puis en calculant la fréquence n'a pas de sens en tant que jeu de contenir que des objets uniques, de sorte que la fréquence de chaque élément est toujours 1.
Enfin
dict.get
est une méthode qui n'est pas une liste ou un dictionnaire si vous ne pouvez pas utiliser[]
:Manière correcte est:
Et Pythonic:
La Pythonic façon à obtenir la fréquence des articles est à utiliser
collections.Compteur
:max()
etmin()
lancer une telle erreur lorsqu'un vide itérable est passé pour eux. Vous pouvez vérifier la durée dev
avant d'appelermax()
.Si vous l'utilisez avec un itérateur alors vous avez besoin de consommer de l'itérateur d'abord avant d'appeler
max()
sur elle parce boolean valeur de l'itérateur est toujoursTrue
, donc on ne peut pas utiliserif
directement:Bonne nouvelle, c'est à partir de Python 3.4, vous serez en mesure de spécifier une option de valeur de retour pour
min()
etmax()
en cas de vide itératif.OriginalL'auteur Ashwini Chaudhary
Lorsque la longueur de v sera de zéro, il va vous donner la valeur d'erreur.
Vous devez vérifier la longueur ou vous devriez vérifier la liste d'abord si c'est nul ou pas.
ou
OriginalL'auteur Aamish Baloch
dans une ligne,
v = max(v) if v else None
OriginalL'auteur Mohideen ibn Mohammed