2017-08-27 73 views
-2

当我尝试在Python排序我的名单,我得到以下错误:Python的排序错误

Traceback (most recent call last): 
    File "C:/Users/natep/OneDrive/Documents/I.T/Level 2/programing/Shop_list.py", line 81, in <module> 
    products.sort(key = lambda x:x[3], reverse=True) 
Name  Measurement  Price  Unit Price 
    File "C:/Users/natep/OneDrive/Documents/I.T/Level 2/programing/Shop_list.py", line 81, in <lambda> 

products.sort(key = lambda x:x[3], reverse=True) 
Chips Drink 
IndexError: list index out of range 
50 2.0  
5.0  3.0  
2.5  1.0  
Chips Drink 
50 2.0  
5.0  3.0  
2.5  1.0  
Process finished with exit code 1 

下面是我使用的代码。我想知道如何对包含列表的列表进行排序。还想知道为什么我的数据将被打印两次,以及如何更好地格式化打印输出以便它对应于正确的列。 (没有导入下载)

任何帮助将不胜感激。

unit_price = price/measurement 
unit.append(unit_price) 

products.append(name_sum) 
products.append(mes_sum) 
products.append(money_sum) 
products.append(unit) 
row_entry.append(products) 

average = "The average product price is ${}".format(mean(money_sum)) 
highest = "The most expensive item is ${}".format(max(money_sum)) 
low = "The cheapest item is ${}".format(min(money_sum)) 

print() 
print("Name\t\tMeasurement\t\tPrice\t\tUnit Price") 
for item in products: 
    print("") 
    for data in item: 
    print(data, "\t", end='') 

products.sort(key = lambda x:x[3], reverse=True) 

我已经加了我所有的代码如下:

# Shopping list 
from statistics import mean 
from operator import itemgetter 

def limit_check(type, question, low, high): 

    valid = False 
    error = "please enter values between {} and or equal to {}".format(low, 
high) 
    while not valid: 
     try: 
      response = type(input(question)) 
      if low < response <= high: 
       valid = True 
       return response 
      else: 
       print(error) 
     except ValueError: 
      print(error) 

products = [] 
mes_sum = [] 
money_sum = [] 
name_sum = [] 
unit = [] 
row_entry = [] 

money = float(input("please enter your budget: $")) 

get_data = True 
while get_data == True: 

name = input("please enter product name: ") 
if name.lower() == "xxx": 
    break 
else: 
    name_sum.append(name) 
    price = limit_check(float,"How much does the item cost", 0, money) 
    money_sum.append(price) 
    measurement = limit_check(int,"Please enter unit of measurement Push 1 
for kg, push 2 for g, push 3 for L, push 4 for mL",0,4) 


    if measurement == int("1"): 
     kg = limit_check(float, "Enter Kg: ", 0, 10) 
     mes_sum.append(kg) 

    elif measurement == int("2"): 
     grams = limit_check(int, "Enter Grams: ", 0, 999) 
     mes_sum.append(grams) 

    elif measurement == int("3"): 
     litres = limit_check(float, "Enter Litres: ", 0, 30) 
     mes_sum.append(litres) 

    elif measurement == int("4"): 
     mL = limit_check(int, "Enter mL: ", 0, 999) 
     mes_sum.append(mL) 

    unit_price = price/measurement 
    unit.append(unit_price) 


    for i in range(len(name_sum)): 
     products.append([name_sum[i], mes_sum[i], money_sum[i], unit[i]]) 

average = "The average product price is ${}".format(mean(money_sum)) 
highest = "The most expensive item is ${}".format(max(money_sum)) 
low = "The cheapest item is ${}".format(min(money_sum)) 



print() 
print("Name\t\tMeasurement\t\tPrice\t\tUnit Price") 
for item in products: 
    print("") 
    for data in item: 
     print(data, "\t", end='') 

products.sort(key = lambda x:x[1], reverse=True) 

目前打印这样的:

名称计量价格单价

looooool 1.0 10.0 10.0
looooool 1.0 10.0 10.0
哈哈1.0 1.0 1.0
过程完成退出代码0

+0

什么是你的数据结构是什么样子?目前还不清楚。 –

+0

可以请您发布产品清单吗? –

+0

你为什么对待:money_sum,mes_sum,name_sum等 - 就好像它们是产品一样? – alfasin

回答

0

您的代码似乎预计products列表中的每个列表都有4个元素(名称,测量,价格和单价),但实际上您的数据只有两个元素每个列表(用于芯片和饮料)。

然后当您尝试对包含长度为2的列表的products进行排序时,可以访问lambda函数中的第4个值。这会触发错误:只有两个值,而不是4.

看起来您已将您想要结束的数据转换为products。相反的:

products.append(name_sum) 
products.append(mes_sum) 
products.append(money_sum) 
products.append(unit) 

做:

for i in range(len(name_sum)): 
    products.append([name_sum[i], mes_sum[i], money_sum[i], unit[i]]) 

或者更简洁:

products.extend(list(map(list, zip(*[name_sum, mes_sum, money_sum, unit])))) 
+0

嗨Trincot,谢谢你的帮助。它的工作,但第一个价值打印两次出于某种原因。名称的长度也会影响打印输出中的间距。希望你的反馈。上面我粘贴了所有的代码。 – Nate

+0

你粘贴到你的问题的代码有缩进。你能解决它吗?确保我提供的代码不是“while”循环的一部分,而是在它之后。 – trincot

+0

谢谢,停止打印第一个项目两次。有没有什么办法可以让产品的名称对数字的位置没有影响,例如这是我现在打印的产品: – Nate