我正在尝试使用zip()
和itertools.zip_longest()
函数。我需要帮助来了解他们,并可能解决我遇到的错误。使用zip()
可以运行代码,但不会获得其中一个列表中的所有条目。使用itertools.zip_longest()
时出现错误,无法解决。
这是我的代码(通过Google Colab运行):
!wget https://raw.githubusercontent.com/muriloasouza/Deep-Learning/master/Input.txt
!wget https://raw.githubusercontent.com/muriloasouza/Deep-Learning/master/Labels.txt
!wget https://raw.githubusercontent.com/muriloasouza/Deep-Learning/master/Input_Train.txt
!wget https://raw.githubusercontent.com/muriloasouza/Deep-Learning/master/Labels_Train.txt
!wget https://raw.githubusercontent.com/muriloasouza/Deep-Learning/master/Input_Valid.txt
!wget https://raw.githubusercontent.com/muriloasouza/Deep-Learning/master/Labels_Valid.txt
batch_size = 3
df_input_train=pd.read_csv('./Input_Train.txt',usecols =['Wind_MWh','Actual_Load_MWh'],chunksize = 24*batch_size, iterator=True)
df_target_train=pd.read_csv('./Labels_Train.txt',usecols =['Potencia_Media_do_Vento_(MW)','Desvio_Padrao_Vento_(MW)','FCSPV_(Fracao_de_Carga_Suprida_pela_Potencia_do_Vento)'],chunksize = batch_size, iterator=True)
df_input_valid=pd.read_csv('./Input_Valid.txt',usecols =['Wind_MWh','Actual_Load_MWh'],chunksize = 24*batch_size, iterator=True)
df_target_valid=pd.read_csv('./Labels_Valid.txt',usecols =['Potencia_Media_do_Vento_(MW)','Desvio_Padrao_Vento_(MW)','FCSPV_(Fracao_de_Carga_Suprida_pela_Potencia_do_Vento)'],chunksize = batch_size, iterator=True)
c= 0
for chunk, chunk2, chunk3, chunk4 in itertools.zip_longest(df_input_train,df_target_train,df_input_valid,df_target_valid):
c = c+1
X_train = chunk.values
X_valid = chunk3.values
X_train = np.resize(X_train,(batch_size,24,2,1))
X_valid = np.resize(X_valid,(batch_size,24,2,1))
Y_train = chunk2.values
Y_valid = chunk4.values
print(X_train)
print(c)
错误:
17 c = c+1
18 X_train = chunk.values
---> 19 X_valid = chunk3.values
20 X_train = np.resize(X_train,(batch_size,24,2,1))
21 X_valid = np.resize(X_valid,(batch_size,24,2,1))
AttributeError: 'NoneType' object has no attribute 'values'
1: zip()
遍历所传递的最小列表(这就是它缺少其中一个列表中某些条目的原因)吗?
2: zip_longest()
遍历较大的那个吗?
3:为什么我会收到该错误?
4:我是否可以在每个列表中精确遍历整个列表的长度?
答案 0 :(得分:0)
无论如何,我是否可以在每个列表的长度上进行迭代?
通过itertools.zip_longest
文档字符串:
当较短的可迭代项用尽时,
fillvalue
被替换 在他们的位置。fillvalue
默认为“无”或可以通过以下方式指定 关键字参数。
>>> for a, b in itertools.zip_longest([1, 2, 3, 4], "abcdefghijk"):
print(a, b)
1 a
2 b
3 c
4 d
None e
None f
None g
None h
None i
None j
None k
使用显式fillvalue
:
for a, b in itertools.zip_longest([1, 2, 3, 4], "abcdefghijk", fillvalue="YAY"):
print(a, b)
1 a
2 b
3 c
4 d
YAY e
YAY f
YAY g
YAY h
YAY i
YAY j
YAY k
您必须决定缺少某项物品时应该怎么办。
答案 1 :(得分:0)
zip组合了多个迭代器。
举个简单的例子,运行:
for x in zip(range(10),range(5)):
print(x)
由于zip以最短的迭代器结束,因此只能打印5次。
zip_longest()
将遍历所有条目,并且如果其中一个迭代器用尽了,它将被None
取代。
import itertools
for x in itertools.zip_longest(range(10),range(5)):
print(x)
1。
是的,zip()
会迭代最短迭代器的长度。
2。
是的,zip_longest()
迭代到最长迭代器的长度。
3。
之所以会出现此错误,是因为chunk3比最长的迭代器短,因此在该迭代中,其值为None
。没有一个没有values
属性。
4。
现在,您正在一起迭代它们。询问您是否只能针对每个长度进行迭代并没有多大意义,因为它们的长度不同并且您正在一起迭代。您可能错过了一些值,或者有些迭代有None
个值。如果不需要一起使用这些值,则可以查看itertools链之类的东西。