Python 3.10 不这么认为:
Python 3.10.6 | packaged by conda-forge | (main, Aug 22 2022, 20:38:29) [Clang 13.0.1 ] \
on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from typing import Iterable
>>> isinstance(list[str], Iterable)
False
>>> list(list[str])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'types.GenericAlias' object is not iterable
Run Code Online (Sandbox Code Playgroud)
Python 3.11 认为它是:
Python 3.11.0 | packaged by conda-forge | (main, Jan 15 2023, 05:44:48) [Clang 14.0.6 ] \
on darwin
Type …Run Code Online (Sandbox Code Playgroud) 对于一维列表,项目的索引如下所示:
a_list = ['a', 'b', 'new', 'mpilgrim', 'new']
a_list.index('mpilgrim')
Run Code Online (Sandbox Code Playgroud)
2或n维列表的等价物是什么?
编辑:我添加了一个例子来澄清:如果我有一个3维列表如下
b_list = [
[1,2],
[3,4],
[5,6],
[7,8]
],
[
[5,2],
[3,7],
[6,6],
[7,9]
]
Run Code Online (Sandbox Code Playgroud)
现在假设我想在此列表中标识某个值.如果我知道第一和第二个维度的索引但不知道我想要的值的第零个索引,我该如何找到第零个索引?
会是这样的:
target_value = 7
b_list[0].index(target_value)
Run Code Online (Sandbox Code Playgroud)
输出为整数:0
首先我要澄清,我不是在问什么是"迭代器".
这就是Python的doc中定义"iterable"这个术语的方式:
iterable
一个能够一次返回一个成员的对象. 迭代的示例包括所有序列类型(例如list,str和tuple)和一些非序列类型,如dict,文件对象,以及使用__iter __()或__getitem __()定义的任何类的对象 方法.Iterables可用于for循环以及需要序列的许多其他地方(zip(),map(),...).当一个可迭代对象作为参数传递给内置函数iter()时,它返回该对象的迭代器.这个迭代器适用于一组值的一次传递.使用iterables时,通常不需要调用iter()或自己处理迭代器对象.for语句会自动为您执行此操作,创建一个临时的未命名变量,以便在循环期间保存迭代器.另请参见迭代器,序列和生成器.
正如其他人所建议的那样,使用isinstance(e, collections.Iterable)是检查对象是否可迭代的最pythonic方法.
所以我用Python 3.4.3做了一些测试:
from collections.abc import Iterable
class MyTrain:
def __getitem__(self, index):
if index > 3:
raise IndexError("that's enough!")
return index
for name in MyTrain():
print(name) # 0, 1, 2, 3
print(isinstance(MyTrain(), Iterable)) # False
Run Code Online (Sandbox Code Playgroud)
结果很奇怪:MyTrain已定义__getitem__方法,但它不被视为可迭代对象,更不用说它一次能够返回一个数字.
然后我删除__getitem__并添加了__iter__方法:
from collections.abc import Iterable
class MyTrain:
def __iter__(self):
print("__iter__ called")
pass
print(isinstance(MyTrain(), Iterable)) # True
for name in …Run Code Online (Sandbox Code Playgroud) 为什么这样:
seq = [(1, 2), (3, 4), (5, 6)]
print(() in seq)
Run Code Online (Sandbox Code Playgroud)
回来False?如何在没有特定值的序列中检查是否存在元组,甚至是通用序列,如本答案中所述.
输入
我有一个非常复杂的清单。
total_aug_rule_path_list =
[[[[['#1_0_0', '#2_0_0', '#3_0_0'], ['#1_0_1', '#2_0_1', '#3_0_1']],
[['#1_0_0', '#2_0_0', '#3_0_0'], ['#1_0_1', '#2_0_1', '#3_0_1']]],
[[['#1_1_0', '#2_1_0', '#3_1_0', '#4_1_0'],
['#1_1_1', '#2_1_1', '#3_1_1', '#4_1_1']]]]]
Run Code Online (Sandbox Code Playgroud)
我有一本字典,其中列表的每个元素作为键。
sym2id_dict = {
'#1_0_0': 1,
'#1_0_1': 2,
'#1_1_0': 3,
'#1_1_1': 4,
'#2_0_0': 5,
'#2_0_1': 6,
'#2_1_0': 7,
'#2_1_1': 8,
'#3_0_0': 9,
'#3_0_1': 10,
'#3_1_0': 11,
'#3_1_1': 12,
'#4_1_0': 13,
'#4_1_1': 14,}
Run Code Online (Sandbox Code Playgroud)
我将把列表的每个元素映射到字典的值。
输出
[[[[[1, 5, 9], [2, 6, 10]], [[1, 5, 9], [2, 6, 10]]],
[[[3, 7, 11, 13], [4, 8, 12, 14]]]]]
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法来尽可能少地使用 for …
例如,如果我有一个dicts的dict或数组的dict,但我只希望"深度"复制到两个级别的深度是否有一个简单的方法来做到这一点?
我环顾四周,看看是否有一个我可以使用的图书馆或一个例子,但我找不到任何东西.我是Python的新手,否则我会编写子程序来自己做.有任何想法吗?代码片段将会受到赞赏,因为我理解它的速度会比解释如何理解更快.
谢谢.
附加信息:
有些人问我为什么要这样做,我需要一个副本(不是一个参考,因为我要修改一些值,我不想要原来的修改)来自dict的一些项目,但是dict是巨大的(许多决定词)因此我不想炸毁我的记忆足迹
我的代码很快
好的,我放弃了.这比我想象的要困难,我没时间搞清楚.我最近尝试了一些调试/测试代码.
# Deep copy any iteratable item to a max depth and defaults to removing the
# rest. If you want to keep the stuff past max depth as references to orig
# pass the argument else_ref=1. Ex:
# dict_copy = copy_to_depth( dict_orig, 2, else_ref=1 )
def copy_to_depth( orig, depth, **kwargs):
copy = type(orig)()
for key in orig:
# Cannot find a reliable and consistent way to determine if the item
# is iterable. …Run Code Online (Sandbox Code Playgroud) 我需要测试从文件(和evaled)读入的对象ConfigParser是否为映射.
这里的术语不完全确定,但让我解释一下.鉴于我的对象被调用,O它必须支持以下列方式使用:
def tester(**kwargs):
print kwargs
tester(**O)
Run Code Online (Sandbox Code Playgroud)
如果O不支持**,则会导致TypeError,例如TypeError: test() argument after ** must be a mapping, not tuple.
这是一个非常简单的场景,但我需要知道O在使用之前它会工作,我需要绝对肯定它不会失败.如果我测试O的是可迭代的,我会使用类似的东西:
try:
iter(O)
except:
O = tuple()
Run Code Online (Sandbox Code Playgroud)
正如In Python中所讨论的,如何确定对象是否可迭代?
我找不到映射的任何并行.如在相同的答案上面所讨论的,使用isinstance和collections不是好的解决方案.
因此,在加载像这样的对象时,我必须将我的测试器函数(没有打印)作为我自己的映射测试
try:
tester(**O)
except TypeError:
O = {}
Run Code Online (Sandbox Code Playgroud)
或者python是否有内置的方法来测试这个,就像迭代一样?似乎应该有一个.
编辑
实际上上面的链接答案从未反对isinstance方法,应该更好地阅读它...
作为Mathematica用户,我喜欢自动"在列表上划线"的函数(如Mathematica所称的那样 - 请参阅http://reference.wolfram.com/mathematica/ref/Listable.html).这意味着如果函数被赋予列表而不是单个值,它会自动使用每个列表条目作为参数并返回结果列表 - 例如
myfunc([1,2,3,4]) -> [myfunc(1),myfunc(2),myfunc(3),myfunc(4)]
Run Code Online (Sandbox Code Playgroud)
我在Python中实现了这个原则,如下所示:
def myfunc(x):
if isinstance(x,list):
return [myfunc(thisx) for thisx in x]
#rest of the function
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法吗?你能想到这个实施或整体战略的任何缺点吗?
在Python中,如何确定可迭代对象是否具有稳定的迭代顺序?
有collections.Iterable抽象的基类,但没有稳定的对应类。
我问的原因是为了能够防止用户或不稳定的迭代顺序(警告他们,当他们通过考试(错误)迭代dict,set等等)的函数,其中迭代的稳定性是至关重要的。
我目前正在尝试使用Python 及其eyeD3 库从mp3 文件中提取歌词。歌词已经嵌入到 mp3 文件中(来自:MusicBee)。我正在尝试使用 eyeD3 返回歌词。我不知道该怎么做。我在网上进行了大量搜索,发现的只是显示如何设置歌词的教程。我只想从文件中读取它们。这是我当前的代码:
track = eyed3.load(path)
tag = track.tag
artist = tag.artist
lyrics = tag.lyrics
Run Code Online (Sandbox Code Playgroud)
艺术家正确返回艺术家姓名,但歌词返回以下内容:
<eyed3.id3.tag.LyricsAccessor object at 0x27402d0>
Run Code Online (Sandbox Code Playgroud)
我怎样才能返回嵌入到 mp3 中的原始文本歌词?这可能吗?
非常感谢您。
python ×10
collections ×1
dictionary ×1
eyed3 ×1
iterable ×1
iterator ×1
lambda ×1
list ×1
mapping ×1
mp3 ×1
mutagen ×1
nested-lists ×1
recursion ×1