我需要在Python中创建一个'容器'对象或类,它保存我也定义的其他对象的记录.该容器的一个要求是,如果认为两个对象相同,则移除一个(任一个).我的第一个想法是使用a set([])作为包含对象,来完成这个要求.
但是,该集不会删除两个相同对象实例中的一个.我必须定义什么来创建一个?
这是Python代码.
class Item(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
def __repr__(self):
return "Item(%s, %s)" % (self.foo, self.bar)
def __eq__(self, other):
if isinstance(other, Item):
return ((self.foo == other.foo) and (self.bar == other.bar))
else:
return False
def __ne__(self, other):
return (not self.__eq__(other))
Run Code Online (Sandbox Code Playgroud)
翻译员
>>> set([Item(1,2), Item(1,2)])
set([Item(1, 2), Item(1, 2)])
Run Code Online (Sandbox Code Playgroud)
很明显__eq__(),被调用的x == y不是集合调用的方法.什么叫?我还必须定义什么其他方法?
注意:Items必须保持可变,并且可以更改,因此我无法提供__hash__()方法.如果这是唯一的方法,那么我将重写使用不可变的Items.
我正在研究H.264解码器,我想知道在哪里可以找到SPS和PPS.我的参考文献告诉我那些是在H.264-Stream中编码的NAL单元,但是当我查看一个带有IsoViewer的示例-MP4-File时,它说SPS和PPS在avcC Box中.
这究竟是如何工作的?它如何查找.mkv文件或其他H.264容器?
提前致谢!
有没有快速的方法来检查一个集合是否完全包含另一个集合?
就像是:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Run Code Online (Sandbox Code Playgroud) 看到代码片段就像
Set<Record> instances = new HashSet<Record>();
Run Code Online (Sandbox Code Playgroud)
我想知道Hashset是否是一种特殊的集合.他们之间有什么区别?
基本上,我试图将一组中的条目连接在一起以输出一个字符串.我试图使用类似于列表的连接函数的语法.这是我的尝试:
list = ["gathi-109","itcg-0932","mx1-35316"]
set_1 = set(list)
set_2 = set(["mx1-35316"])
set_3 = set_1 - set_2
print set_3.join(", ")
Run Code Online (Sandbox Code Playgroud)
但是我收到此错误: AttributeError: 'set' object has no attribute 'join'
集合的等效调用是什么?
我有ArrayList一些记录和一个列包含气体名称为CO2 CH4 SO2等.现在我想要检索不同的气体名称(唯一),只是没有重复ArrayList.怎么做到呢?
所以我在家庭作业中遇到了这两个问题而且我被困在第二个问题上.
使用Python集合理解(Python相当于Set Builder表示法)生成一组小于100的所有素数.回想一个素数是一个大于1的整数,不能被除整数以外的任何整数整除.本身和1.将您的素数集存储在变量中(您将需要它用于其他部分).输出您的素数组(例如,使用打印功能).
使用Python集合理解来生成一组有序对(长度为2的元组),它由所有由小于100的素数组成的素数对组成.素数对是一对连续的奇数,它们都是素数.将您的Prime Pairs集存储在变量中.你的1号组将非常有帮助.输出您的Prime对的集合.
对于第一个,这完美地工作:
r= {x for x in range(2, 101)
if not any(x % y == 0 for y in range(2, x))}
Run Code Online (Sandbox Code Playgroud)
但是,我对第二个问题很难过.我想我可能不得不采取一些东西的笛卡尔积,但我只是不确定.
这让我有点接近,但我只想要连续对.
cart = { (x, y) for x in r for y in r
if x < y }
Run Code Online (Sandbox Code Playgroud) 我发现更新操作std::set很繁琐,因为cppreference上没有这样的API .所以我现在做的是这样的:
//find element in set by iterator
Element copy = *iterator;
... // update member value on copy, varies
Set.erase(iterator);
Set.insert(copy);
Run Code Online (Sandbox Code Playgroud)
基本上迭代器返回的Set是a const_iterator,你不能直接改变它的值.
有一个更好的方法吗?或者也许我应该std::set通过创建我自己的(我不知道它是如何工作的...)来覆盖.
如果我只想在集合中添加单个值,那么在python中添加和更新操作之间有什么区别.
a = set()
a.update([1]) #works
a.add(1) #works
a.update([1,2])#works
a.add([1,2])#fails
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会这样.
这可能是因为集合对Javascript来说相对较新,但是我无法在StackO或其他任何地方找到一篇文章来讨论Javascript中两者之间的性能差异.那么,两者之间在性能方面有什么不同?具体来说,当涉及删除,添加和迭代时.
set ×10
python ×5
java ×2
list ×2
arrays ×1
c++ ×1
comparison ×1
h.264 ×1
interface ×1
iteration ×1
javascript ×1
methods ×1
mkv ×1
mp4 ×1
parameters ×1
performance ×1
python-2.7 ×1
stl ×1