老实说,我在这里有点困惑,为什么我不能在相同的数据上迭代两次?
def _view(self,dbName):
db = self.dictDatabases[dbName]
data = db[3]
for row in data:
print("doing this one time")
for row in data:
print("doing this two times")
Run Code Online (Sandbox Code Playgroud)
这将打印出"一次这样做"几次(因为数据有几行),但它根本不会打印出"这样做两次"......
我第一次迭代数据工作正常,但第二次当我运行最后一个列表"for data in data"时,这没有返回...所以执行它一次工作但不是两次......?
仅供参考 - 数据是一个csv.reader对象(如果是这样的原因)......
这是我的代码:
from collections import deque
class linehistory:
def __init__(self, lines, histlen=3):
self.lines = lines
self.history = deque(maxlen=histlen)
def __iter__(self):
for lineno, line in enumerate(self.lines,1):
self.history.append((lineno, line))
yield line
def clear(self):
self.history.clear()
f = open('somefile.txt')
lines = linehistory(f)
next(lines)
Run Code Online (Sandbox Code Playgroud)
错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'linehistory' object is not an iterator
Run Code Online (Sandbox Code Playgroud)
我不知道为什么linehistory对象不是迭代器,因为它已经__iter__在the类中包含了方法.
inp = int(input("Enter a number:"))
for i in inp:
n = n + i;
print (n)
Run Code Online (Sandbox Code Playgroud)
...抛出一个错误: 'int' object is not iterable
我想通过添加每个数字找出总数,例如,110.1 + 1 + 0 = 2.我该怎么做?
谢谢
我正在尝试学习Python,我开始使用一些代码:
a = [3,4,5,6,7]
for b in a:
print a
a.pop(0)
Run Code Online (Sandbox Code Playgroud)
输出是:
[3, 4, 5, 6, 7]
[4, 5, 6, 7]
[5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
我知道在我循环的时候改变数据结构并不是一个好的做法,但我想了解Python在这种情况下如何管理迭代器.
主要问题是:如果我改变状态,它如何知道它必须完成循环a?
我找到:
>>> a={'x':42, 'y':3.14, 'z':7}
>>> b=a.__iter__()
>>> b.__dir__()
['__next__', ..., '__iter__', ...]
>>> b
<set_iterator object at 0x7efdd4e5afc0>
Run Code Online (Sandbox Code Playgroud)
迭代器是否总是有__iter__方法?
根据/sf/answers/691898161/,迭代器也是可迭代的.如果迭代器总是有__iter__方法是真的吗?
是否有统一的方法来了解迭代是否会使用可迭代对象?
假设您有一个特定的函数crunch,它要求参数的可迭代对象,并多次使用它.就像是:
def crunch (vals):
for v in vals:
chomp(v)
for v in vals:
yum(v)
Run Code Online (Sandbox Code Playgroud)
(注意:将两个for循环合并在一起不是一个选项).
如果使用不是列表的iterable调用函数,则会出现问题.在以下调用中,yum函数永远不会执行:
crunch(iter(range(4))
Run Code Online (Sandbox Code Playgroud)
我们原则上可以通过重新定义crunch函数来解决这个问题,如下所示:
def crunch (vals):
vals = list(vals)
for v in vals:
chomp(v)
for v in vals:
yum(v)
Run Code Online (Sandbox Code Playgroud)
但如果调用的话,这将导致使用两倍的内存crunch:
hugeList = list(longDataStream)
crunch(hugeList)
Run Code Online (Sandbox Code Playgroud)
我们可以通过这样定义来解决这个crunch问题:
def crunch (vals):
if type(vals) is not list:
vals = list(vals)
for v in vals:
chomp(v)
for v in vals:
yum(v)
Run Code Online (Sandbox Code Playgroud)
但仍然存在colud,其中调用代码将数据存储在某些内容中
例如:
from collections …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个朴素的贝叶斯分类器,如此链接中所述. 参考这条线
X_new_tfidf = tfidf_transformer.transform(X_new_counts)
Run Code Online (Sandbox Code Playgroud)
在Training the Classifier副标题下,我有一个类似的行,X_new_counts = count_vect.transform(input.plot_movie)在我的代码中应该使用iterable作为转换函数的输入.它 input是来自DataFrame的记录,属于类型pd.Series并包含以下条目,我将其input.plot_movie作为输入发送到转换函数:
但是,我收到以下错误: Iterable over raw text documents expected, string object received
我该如何解决这个错误?我也提到了这个答案,其中人说这s是一个可迭代的,因为它被分配了一个字符串.我也碰到这个环节,其中一个TypeError: 'String' object is not iterable遇到.我在这里错过了什么吗?这些联系似乎相互矛盾.
编辑:
我刚刚意识到这input.plot_movie是unicode类型,并决定将其转换为字符串.我再次遇到同样的错误.
为什么类需要定义__iter__()返回self,以获取类的迭代器?
class MyClass:
def __init__(self):
self.state = 0
def __next__(self):
self.state += 1
if self.state > 4:
raise StopIteration
return self.state
myObj = MyClass()
for i in myObj:
print(i)
Run Code Online (Sandbox Code Playgroud)
控制台日志:
Traceback (most recent call last):
for i in myObj:
TypeError: 'MyClass' object is not iterable
Run Code Online (Sandbox Code Playgroud)
迭代器是具有next(Python 2)或
__next__(Python 3)方法的对象.
添加以下内容的任务:
def __iter__(self):
return self
Run Code Online (Sandbox Code Playgroud)
是返回定义方法的迭代器或类的对象__next__().
但是,当MyClass在myObj = MyClass()行中实例化时,不是返回MyClass对象(定义__next__()方法)的任务,而是由__new__()MyClass实例化了吗?
类定义__next__()方法的对象不是自己的迭代器吗?
我已经研究了问题__iter__方法中返回self的用途是什么?并构建一个基本的Python迭代器,但我仍然无法理解 …
只是初学者使用python/postgres组合,请原谅我,如果这是微不足道的.我正在使用sqlalchemy执行原始SQL查询:
SELECT * FROM table WHERE pk_table_id IN ()
Run Code Online (Sandbox Code Playgroud)
对于下面的示例,我尝试self.ids了包含字符串或整数的元组以及包含字符串或整数的数组.无论哪种方式,它都无法正常工作.
当我使用这一行时:
my_connection.execute('SELECT * FROM public.table WHERE pk_table_id IN (%s)', self.ids)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)
有什么建议?
正如你已经明白我是一个初学者,我正在努力理解编写这个函数的"Pythonic方式"是什么.我知道其他线程可能包含对此的部分答案,但我不知道该寻找什么,因为我不明白这里发生了什么.
这行是我朋友发给我的代码,用于改进我的代码:
import numpy as np
#load_data:
def load_data():
data_one = np.load ('/Users/usr/... file_name.npy')
list_of_tuples = []
for x, y, label in data_one:
list_of_tuples.append( (x,y) )
return list_of_tuples
print load_data()
Run Code Online (Sandbox Code Playgroud)
"改进"版本:
import numpy as np
#load_data:
def load_data():
data_one = np.load ('/Users/usr.... file_name.npy')
list_of_tuples = [(x,y) for x, y, label in data_one]
return list_of_tuples
print load_data()
Run Code Online (Sandbox Code Playgroud)
我想知道: