我在python中有以下字典:
d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
Run Code Online (Sandbox Code Playgroud)
我需要一种方法来查找此词典中是否存在诸如"一个"或"两个"的值.
例如,如果我想知道索引"1"是否存在,我只需要键入:
"1" in d
Run Code Online (Sandbox Code Playgroud)
然后python会告诉我这是真还是假,但我需要做同样的事情,除了找到一个值是否存在.
在蟒蛇3.X keys(),values()并items()返回意见.现在虽然视图肯定有优势,但它们似乎也会导致一些兼容性问题.例如matplotlib(最终是numpy).作为一个例子这和这对stackexchange问题的答案只是正常工作与Python 2.x的,但在Python 3.4执行他们的时候抛出一个异常.
一个最小的例子是:
import matplotlib.pyplot as plt
d = {1: 2, 2: 10}
plt.scatter(d.keys(), d.values())
Run Code Online (Sandbox Code Playgroud)
哪个TypeError: float() argument must be a string or a number, not 'dict_values'用python 3.4 引发.
虽然对于最小的例子,Exception非常清楚,但是由于同样的问题而出现了这个问题,而且这里的Exception不太清楚:TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' …
dict方法dict.keys(),dict.items()和dict.values()返回"views"而不是list. http://docs.python.org/dev/3.0/whatsnew//3.0.html
首先,视图与迭代器有何不同?其次,这种变化有什么好处?这只是出于性能原因吗?
这对我来说似乎不太直观,也就是说,我要求列出一些东西(给我所有的钥匙),然后我又得到了别的东西.这会让人迷惑吗?
我想生成以下效果:
for i, j in d.items() and k, v in c.items():
print i, j, k, v
Run Code Online (Sandbox Code Playgroud)
这是错的.我想知道如何实现这一目标?
我正在尝试使用名为bidi的Python包.在这个包中的模块(algorithm.py)中,有一些行给出了错误,尽管它是包的一部分.
以下是这些行:
_LEAST_GREATER_ODD = lambda x: (x + 1) | 1
_LEAST_GREATER_EVEN = lambda x: (x + 2) & ~1
X2_X5_MAPPINGS = {
'RLE': (_LEAST_GREATER_ODD, 'N'),
'LRE': (_LEAST_GREATER_EVEN, 'N'),
'RLO': (_LEAST_GREATER_ODD, 'R'),
'LRO': (_LEAST_GREATER_EVEN, 'L'),
}
# Added 'B' so X6 won't execute in that case and X8 will run its course
X6_IGNORED = X2_X5_MAPPINGS.keys() + ['BN', 'PDF', 'B']
X9_REMOVED = X2_X5_MAPPINGS.keys() + ['BN', 'PDF']
Run Code Online (Sandbox Code Playgroud)
如果我在Python 3中运行代码,我会收到以下错误消息:
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
from bidi.algorithm …Run Code Online (Sandbox Code Playgroud) 我一直在试图理解内置视图对象被退回.items(),.values(),.keys()在Python 3或类似的.viewitems(),.viewvalues(),.viewkeys()。关于该主题还有其他线程,但没有一个(甚至doc)似乎描述了它们在内部是如何工作的。
与listPython 2 中返回的类型副本相比,这里的主要收益似乎是高效的。经常将窗口与字典项进行比较(如在此线程中)。
但是那个窗口是什么,为什么它更有效?
我唯一能看到的是,视图对象似乎是 类似集合的对象,对于成员资格测试来说,它们通常更快。但这是唯一的因素吗?
代码示例
>>> example_dict = {'test':'test'}
>>> example_dict.items()
dict_items([('test', 'test')])
>>> type(example_dict.items())
<class 'dict_items'>
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是关于这dict_items门课的。这在内部如何运作?
我正在使用此代码,直接来自scikit-learn页面.它创建了一个字典:
symbol_dict = {
'TOT': 'Total',
'XOM': 'Exxon',
'CVX': 'Chevron',}
symbols, names = np.array(symbol_dict.items()).T
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
TypeError: iteration over a 0-d array
Run Code Online (Sandbox Code Playgroud)
这段代码直接来自示例代码,所以我不知道出了什么问题.
我dict.viewkeys()今天在学习,我发现我的python称它为dict_keys对象.我可以将它作为一个可迭代的处理,但它不是一个生成器,因为我可以不止一次迭代它.
根据我的有限知识,我只知道一些数据类型,如String,int,float,list,dict,tuple,set.
但昨天我学会了enumerate()返回一个特殊的数据对,只能使用dict()一次,因此它是一个特殊的元组生成器,具有(index_of_iteration, item)价值
这个dict_keys对象是另一个"我不知道究竟是什么,但我知道如何使用它"在python中的对象类型,还是其他什么?
我知道您可以通过多种方式从字典中选择随机值.
在Python 2中:
random.choice(d.keys())
Run Code Online (Sandbox Code Playgroud)
在Python 3中:
random.choice(list(d.keys()))
Run Code Online (Sandbox Code Playgroud)
尽管如此,两种方法都需要在随机选择之前将变换(即线性时间O(n))转换为列表.例如,我知道在Python 3中d.keys()返回一个迭代器,我猜测在Python 3中,列表是从字典内部创建的.
是否可以在恒定时间内从字典中选择一个值,即O(1)?
编辑:到目前为止的评论,我认为这是不可能的,至少不是直截了当的方式.需要辅助结构.
编辑2:我认为字典可以在恒定时间内随机选择,因为内部它是一个哈希表,即内部它必须有一个数组或类似的东西.当然,这取决于内部实现,但理论上我认为这是可能的.
我有一个有序的字典,我试图以相反的顺序通过它,基本上从插入的最后一个(键,值)开始.
dicts = OrderedDict()
...
for key, value in reversed(dicts.items()):
Run Code Online (Sandbox Code Playgroud)
当我在Python 3.5.1中使用PyCharm时,上面的代码工作正常,但是当我将它放在codefights上时,使用他们的Python 3解释器(不知道确切的版本),我得到for循环实现的下面的错误:
TypeError: argument to reversed() must be a sequence
Run Code Online (Sandbox Code Playgroud)
为什么会发生此错误,我该如何解决?
python ×8
dictionary ×6
python-3.x ×5
dictview ×2
numpy ×2
bidi ×1
find ×1
iterator ×1
matplotlib ×1
python-2.7 ×1
random ×1
reverse ×1
scikit-learn ×1
typeerror ×1