我正在使用多处理pool.starmap功能。我发现一个奇怪的问题。
from multiprocessing import Pool
p = multiprocessing.Pool()
NODE = [1,2,3,4];
PageRank = [0.25,0.25,0.25,0.25];
Destination = [[2,3,4],[3,4],[1,4],[2]];
Data = zip(NODE,PageRank,Destination)
Run Code Online (Sandbox Code Playgroud)
所以我使用zip函数创建一个数据集Data,它是一个列表,每个条目都是长度为 3 的元组。然后我调用该函数
p.starmap(MyFunction, zip(NODE,PageRank,Destination))
Run Code Online (Sandbox Code Playgroud)
效果很好。
但是,当我输入
p.starmap(MyFunction, Data))
Run Code Online (Sandbox Code Playgroud)
它输出空列表[]!!!我真的不知道发生了什么事。我实际上只是替换zip(NODE,PageRank,Destination)为Data,这应该是同一件事,对吧?
是因为我使用 Jupyter 笔记本导致这个问题吗?
我在Python中使用networkx作为图形方法和各种实用程序的功能接口.我想在图表中创建一个包含节点所有邻居的列表.
该网页声明all_neighbors(图形,节点)返回迭代器.那是什么意思?如何在列表中保存邻居?
我们有一个清单item_list,
item_list = ["a", "b", "XYZ", "c", "d", "e", "f", "g"]
Run Code Online (Sandbox Code Playgroud)
我们使用for循环遍历其项目,如果是item "XYZ",则跳过项目"c", "d", "e"并继续"f":
for item in item_list:
if item == "XYZ":
do_something()
skip_3_items() ----> skip items "c", "d", "e"
else:
do_something_else()
Run Code Online (Sandbox Code Playgroud)
什么可能是实现这一目标的最pythonic方式?
我有一个只包含属性的类,我想打包/解包来处理它.我collections.abc应该实现什么才能获得这种行为?
class Item(object):
def __init__(self, name, age, gender)
self.name = name
self.age = age
self.gender = gender
a, b, c = Item("Henry", 90, "male")
Run Code Online (Sandbox Code Playgroud)
我想避免使用namedtuple.
class test(object):
def __init__(self):
pass
def __iter__(self):
return "my string"
o = test()
print iter(o)
Run Code Online (Sandbox Code Playgroud)
为什么这会追溯?
$ python iter_implement.py
Traceback (most recent call last):
File "iter_implement.py", line 9, in <module>
print iter(o)
TypeError: iter() returned non-iterator of type 'str'
Run Code Online (Sandbox Code Playgroud)
我希望__iter__在这种情况下只返回字符串.何时以及为什么检测到返回的对象不是迭代器对象?
我是Python新手,我正在尝试itertools:
import itertools as it
obj = it.permutations(range(4))
print(obj)
for perm in obj:
print( perm )
Run Code Online (Sandbox Code Playgroud)
我的问题:如何在不使用循环的情况下obj 直接查看/打印所有排列for?
我尝试了什么:
我尝试使用__dict__和vars在这个SO链接中建议,但两个都不起作用(前者似乎不存在对象,而后者生成'TypeError:'itertools.permutations'对象不可调用').
请原谅,如果我的问题相当无趣 - 这个属性问题看起来很复杂,大部分用SO链接写的东西飞过我的头脑.
(我是Python的新手,所以即使在阅读教程之后,很多东西也让我感到困惑......)
最初,我有如下代码:
strings = ['>abc', 'qwertyu', '>def', 'zxcvbnm']
matrix = zip(*strings)
for member in matrix:
print("".join(member)) # characters are printed as expected
Run Code Online (Sandbox Code Playgroud)
- 这符合我的预期.但由于某种原因,我想确定矩阵中的成员数量; 因为len(矩阵)给出了错误,我决定将其复制到转换到列表:mtxlist = list(matrix).令人惊讶的是,在这一行之后,矩阵的内容似乎发生了变化 - 或者至少我不能像上面那样使用它:
strings = ['>abc', 'qwertyu', '>def', 'zxcvbnm']
matrix = zip(*strings)
mtxlist = list(matrix) # this assignment empties (?) the matrix
for member in matrix:
print("".join(member)) # nothing printed
Run Code Online (Sandbox Code Playgroud)
谁能解释那里发生了什么?
在迭代只包含 1 个字符串的元组时,我注意到一个奇怪的行为:
foo = ("hello")
for entry in foo:
print(entry)
Run Code Online (Sandbox Code Playgroud)
输出:
h
e
l
l
o
Run Code Online (Sandbox Code Playgroud)
但我希望这里只迭代一次,并连续输出“hello”。
如果我的元组包含 2 个条目,那就是发生的事情:
foo = ("hello", "world!")
for entry in foo:
print(entry)
Run Code Online (Sandbox Code Playgroud)
输出:
hello
world!
Run Code Online (Sandbox Code Playgroud)
它是 CPython 实现中的错误吗?更奇怪的是,如果我使用列表而不是元组,则不会发生这种情况:
foo = ["hello"]
for entry in foo:
print(entry)
Run Code Online (Sandbox Code Playgroud)
输出:
hello
Run Code Online (Sandbox Code Playgroud) range()如何区分在这种情况下进行的调用?
例:
def ex():
list = [1,2,3,4]
for val in range(len(list)):
print(val)
break
for val in range(len(list)):
print(val)
break
Run Code Online (Sandbox Code Playgroud)
输出 -
0
0
Run Code Online (Sandbox Code Playgroud)
总之,我的问题是为什么输出不是这样产生的?
0
1
Run Code Online (Sandbox Code Playgroud)
在第一次调用'first for循环'中的range()期间,调用是'range(len(list))',并且在第一次调用'second for循环'中的range()时,调用是'range(len(list))',相当于'first for循环'中第二次调用range().range()如何知道调用是来自'second for loop'而不是'first for loop'?
我已经做了一段时间的程序程序员,只是试图将我的思维方式转变为使用函数式编程(目前在 Python 3 中)。因此,我没有编写 for-each 循环,而是试图掌握map和list(map(..))
假设我有一个简单的for-in循环,它执行一些资源繁重的计算(print为了简单起见,我将在此处替换):
arr = [1,2,3,4]
for x in arr:
print(x)
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试执行以下操作时
map(lambda x: print(x), arr)
Run Code Online (Sandbox Code Playgroud)
什么也没发生,直到,我把它包装在一个列表中,它完成了我的超重print功能:
list(map(lambda x: print(x), arr))
Run Code Online (Sandbox Code Playgroud)
为什么?我错过了什么?我知道 map 返回一个迭代器,它应该节省内存,而不是立即保存整个列表。但是我的超重print功能什么时候会被触发呢?
C++新秀在这里.我编写了一个函数,它从向量中返回一个迭代器,我想使用这个迭代器从头到尾迭代向量.但是,矢量迭代器就像这样使用
for (auto iterator = vec.begin(); iterator != vec.end(); iterator ++) {
// do something here
}
Run Code Online (Sandbox Code Playgroud)
这意味着我还需要一个vec.end()来实现这一点.无论如何我只能使用vec.begin()迭代一个向量,就像我在python中常见的那样
for value in some_iterator:
# do something
Run Code Online (Sandbox Code Playgroud)
编辑:一些不相关的更新:
我看到一些关于我的python iterator和iterable的评论.迭代器确实可以这种方式使用(至少在Python 3中).例如:
some_list = [1,2,3,4]
some_iterator = iter(some_list)
for value in some_iterator:
print(value)
Run Code Online (Sandbox Code Playgroud) python ×10
iterator ×2
attributes ×1
c++ ×1
for-loop ×1
lambda ×1
list ×1
networkx ×1
pool ×1
python-2.7 ×1
python-3.x ×1
range ×1
string ×1
tuples ×1