如何解决Python中的i ++循环错误?

时间:2015-10-03 04:47:03

标签: python

我当前的代码出现以下错误:IndexError:列表索引超出范围所以我想知道是否有任何方法可以使用类似于i ++的东西来自Python中的java循环,其中代码将打印“name” +列表,列表中的每个列表均匀定位。

对不起,如果这看起来有点令人困惑,但作为初学者,很难解释一些事情:p

例如:

i = 0
"name" + list[0]
i = 1
"price" + list[1]
i = 2
"name" + list[2]

代码:

    import pickle


list1 = []
ans = " "

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price


while ans != 'no':
    ans = input("Would you like to add a new product, 'yes' or 'no': ")
    if ans == 'no':
        break
    if ans == 'yes':
        name = input("What is your product name?")
        price = input("What is your product price?")
        list1.append(name)
        list1.append(price)


output = open("save1.pkl", 'wb')
pickle.dump(list1, output,pickle.HIGHEST_PROTOCOL)

output.close()

print(" ")

inputFile = open("save1.pkl", 'rb')
list2 = pickle.load(inputFile)
inputFile.close()

for i in range(0,10):
    print("Name:" + list2[i] + " " + "Price:" + list2[i + 1])

4 个答案:

答案 0 :(得分:3)

所以看起来你已经得到list,其中所有偶数索引都是name s,奇数索引是price s。您不希望或需要在此处编制索引,因为Python有比C更好的解决方案。您可以将扩展切片与zip结合使用,以便成对地迭代它们:

for name, price in zip(list2[::2], list2[1::2]):
    print("Name:" + name + " " + "Price:" + price)

list2[::2]从头到尾获取所有其他元素,而list2[1::2]获取从索引1到结尾的所有其他元素。 zip然后从每个切片返回tuple个配对值,因此您获得索引0和1的值作为您的第一个nameprice,2和3给您的第二个nameprice等等。我们将它们解压缩到循环本身的有意义的名称中,所以我们没有使用具有神秘含义的list2索引,而是清楚我们&# 39;有名字和价格。

答案 1 :(得分:2)

Python惯例通常是为了避免以这种方式迭代索引,正是因为在如此低的水平上思考往往导致这些类型的问题。您以这种方式使用索引的原因是因为您没有使用适当的数据结构 - 作为一般规则,列表的元素应该在概念上都是"同样的事情&# 34; (名称或价格)而不是在那些之间交替。

您可以通过略微修改第一个循环,将其构建为(name, price)元组列表(概念上,产品列表):

    name = input("What is your product name?")
    price = input("What is your product price?")
    product = (name, price)
    list1.append(product)

然后你的第二个循环可以直接迭代这些产品:

for product in list2:
    name, price = product

或简称:

for name, price in list2:

通过更多地考虑使用何种数据结构,您几乎总能使代码更易于读写。

答案 2 :(得分:1)

你可以这样做:

for list in list2:

我将永远是list2的给定成员

答案 3 :(得分:1)

所以问题是在某些时候列表中没有下一个项目

你想在最后一个对象上做什么样的行为?

附加:您可以使用len(list2)代替硬编码范围值。像for i in range(0, len(list2)):这样的东西。在您的代码中,您可以这样做:

for i in range(0, len(list2) -1, 2):
  print("Name:" + list2[i] + " " + "Price:" + list2[i + 1])

如果您的list2为['a', 'b', 'c', 'd'],则会打印:

Name:a Price:b
Name:c Price:d