我当前的代码出现以下错误: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])
答案 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的值作为您的第一个name
和price
,2和3给您的第二个name
和price
等等。我们将它们解压缩到循环本身的有意义的名称中,所以我们没有使用具有神秘含义的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