我有一个python列表,其中元素可以重复.
>>> a = [1,2,2,3,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
我想n从列表中获取第一个独特的元素.所以,在这种情况下,如果我想要前5个独特元素,它们将是:
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
我已经提出了使用生成器的解决方案:
def iterate(itr, upper=5):
count = 0
for index, element in enumerate(itr):
if index==0:
count += 1
yield element
elif element not in itr[:index] and count<upper:
count += 1
yield element
Run Code Online (Sandbox Code Playgroud)
正在使用:
>>> i = iterate(a, 5)
>>> [e for e in i]
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
我怀疑这是最优化的解决方案.是否有一种替代策略可以实现以更加pythonic和更有效的方式编写它?
我dataclasses在Python 3.7中尝试新的
的dataclass装饰可以传递的参数来控制被添加到类dunder功能.
出于某种原因,装饰似乎并没有提高TypeError的eq=False说法.
根据文档:
eq: If true (the default), an __eq__ method will be generated.
This method compares the class as if it were a tuple of its fields, in order.
Both instances in the comparison must be of the identical type
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,如果我通过eq = False,__eq__则不会添加函数,并且TypeError在比较同一类的两个实例时应抛出a .相反,该eq参数似乎没有任何效果.
@dataclass(eq = False)
class Number:
val: int
a = Number(1)
b = Number(2)
c = Number(1)
a …Run Code Online (Sandbox Code Playgroud) Python 3.7提供了dataclasses具有预定义特殊功能的新功能.
从全局来看,dataclasses并SimpleNameSpace都提供了很好的数据封装工厂.
@dataclass
class MyData:
name:str
age: int
data_1 = MyData(name = 'JohnDoe' , age = 23)
data_2 = SimpleNameSpace(name = 'JohnDoe' , age = 23)
Run Code Online (Sandbox Code Playgroud)
很多时候我SimpleNameSpace只是用来包装数据并移动它.
我甚至将它子类化为添加特殊功能:
from types import SimpleNameSpace
class NewSimpleNameSpace(SimpleNameSpace):
def __hash__(self):
return some_hashing_func(self.__dict__)
Run Code Online (Sandbox Code Playgroud)
对于我的问题:
SimpleNameSpace和dataclasses?SimpleNameSpace?dataclasses迎合什么?我有一个用例,我必须生成md5一个JSON对象的哈希值,并比较服务器和浏览器中的哈希值.
浏览器客户端生成哈希,然后向服务器请求相同资源的哈希[恰好是JSON对象],并比较两个哈希以决定下一步做什么.
对于我正在使用的服务器Python和浏览器客户端Javascript.
对我来说,两种情况下产生的哈希都不匹配.这是我的代码:
Python:
>>> import hashlib
>>> import json
>>> a = {"candidate" : 5, "data": 1}
>>> a = json.dumps(a, sort_keys = True).encode("utf-8")
>>> hashlib.md5(a).hexdigest()
>>> 12db79ee4a76db2f4fc48624140adc7e
Run Code Online (Sandbox Code Playgroud)
JS:我在浏览器中使用md5进行散列处理
> var hash = require("md5")
> var data = {"candidate":5, "data":1}
> data = JSON.stringify(data)
> md5(data)
> 92e99f0a99ad2a3b5e02f717a2fb83c2
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
>>all([])
True
>>all([[]])
False
>>all([[[]]])
True
>>all([[[[]]]])
True
Run Code Online (Sandbox Code Playgroud)
all()的文档读取它返回True是所有元素都是True /对于一个空列表.为什么所有([[]])评估为False?因为[]是[[]]的成员,所以它也应该评估为True.
我正在尝试以完全相同的方式比较django的Q对象。
但是,尽管所有孩子以及他们之间的关系都是一样的,但他们并没有被视为平等。
from django.db.models import Q
$ q1 = Q(a=1) & Q(b=1) & Q(c=1)
$ q2 = Q(a=1) & Q(b=1) & Q(c=1)
$ q1 == q2
$ False
Run Code Online (Sandbox Code Playgroud)
这在我的单元测试中构成了问题,在该单元测试中,我使用Q对象为查询集构建了过滤器。
为什么两个Q对象不相等?
我正在使用Django 1.11。
Python似乎区分[x]和list(x)创建列表对象时,哪里x是可迭代的.为何如此区别?
>>> a = [dict(a = 1)]
>>> [{'a' : 1}]
>>> a = list(dict(a=1))
>>> a = ['a']
Run Code Online (Sandbox Code Playgroud)
虽然第一个表达式似乎按预期工作,但第二个表达式更像是以这种方式迭代一个字典:
>>> l = []
>>> for e in {'a' :1}:
l.append(e)
>>> l
>>> ['a']
Run Code Online (Sandbox Code Playgroud) python ×7
python-3.7 ×2
python-3.x ×2
built-in ×1
django ×1
generator ×1
hash ×1
javascript ×1
list ×1
md5 ×1
set ×1
unique ×1