我想从以下列表中获取唯一值:
['nowplaying', 'PBS', 'PBS', 'nowplaying', 'job', 'debate', 'thenandnow']
Run Code Online (Sandbox Code Playgroud)
我需要的输出是:
['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']
Run Code Online (Sandbox Code Playgroud)
此代码有效:
output = []
for x in trends:
if x not in output:
output.append(x)
print(output)
Run Code Online (Sandbox Code Playgroud)
我应该使用更好的解决方案吗?
由于dictPython 3.6 中的实现发生了变化,现在默认排序.现在还set保留秩序吗?
我找不到任何关于它的信息,但由于这两种数据结构在它们工作的方式非常相似,我认为可能就是这种情况.
我知道dict在所有情况下都无法订购s,但它们大多数情况下都是如此.如Python文档中所述:
这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖它
我最近惊讶地发现,虽然 dicts 保证在 Python 3.7+ 中保留插入顺序,但集合不是:
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> d
{'a': 1, 'b': 2, 'c': 3}
>>> d['d'] = 4
>>> d
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
Run Code Online (Sandbox Code Playgroud)
>>> s = {'a', 'b', 'c'}
>>> s
{'b', 'a', 'c'}
>>> s.add('d')
>>> s
{'d', 'b', 'a', 'c'}
Run Code Online (Sandbox Code Playgroud)
这种差异的基本原理是什么?导致 Python 团队更改 dict 实现的相同效率改进也不适用于集合吗?
我不是在寻找指向有序集实现的指针或使用 dicts 作为集合的替代品的方法。我只是想知道为什么 Python 团队没有在他们为 dicts 这样做的同时使内置集保留顺序。
我正在Python中进行集合差异操作:
x = [1, 5, 3, 4]
y = [3]
result = list(set(x) - set(y))
print(result)
Run Code Online (Sandbox Code Playgroud)
我越来越:
[1, 4, 5]
Run Code Online (Sandbox Code Playgroud)
我需要获得下一个操作的第一个元素,这很重要.如何x以原始格式保留列表?
有人问这里时,把原因1和True在set仅1被保留.
这当然是因为1==True.但在哪些情况下1保留并保留哪些情况True?
让我们来看看:
传递一个list来构建set而不是使用set符号:
>>> set([True,1])
{True}
>>> set([1,True])
{1}
Run Code Online (Sandbox Code Playgroud)
似乎是逻辑的:set迭代内部列表,并且不添加第二个元素,因为它等于第一个元素(注意set([True,1]) 不能产生1,因为set无法知道列表中的内容.它甚至可能不是list一个可迭代的)
现在使用set符号:
>>> {True,1}
{1}
>>> {1,True}
{True}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,似乎是以相反的顺序处理项目列表(在Python 2.7和Python 3.4上测试).
但这有保证吗?或者只是一个实现细节?
我知道Python中有一些神奇的方法可以被类覆盖,以控制某些内置函数处理这些类的成员的方式。例如,len()和的行为可以通过魔术方法和str()覆盖:__len__()__str__()
class EmptySet(object):
def __len__(self):
return 0
def __str__(self):
return '[]'
>>> e = EmptySet()
>>> str(e)
[]
>>> len(e)
0
Run Code Online (Sandbox Code Playgroud)
还有__cmp__()and__ge__()等__le__()方法来控制如何比较这些对象以及如何对它们的列表进行排序list.sort()。我的问题不是关于自定义列表中对象的顺序,而是关于对对象本身进行排序。假设该集合不为空并且我想用sorted()它来排序:
class SetOfTwo(object):
def __init__(self, a , b):
el_0 = a
el_1 = b
def __len__(self):
return 2
def __str__(self):
return '[{}, {}]'.format(el_0, el_1)
Run Code Online (Sandbox Code Playgroud)
sorted()如果元素不按顺序排列,我可以实现一种神奇的方法来翻转元素吗?我正在想象以下行为:
>>> s = SetOfTwo(2, 1)
>>> str(s)
[2, 1]
>>> t = sorted(s)
>>> str(t)
[1, 2] …Run Code Online (Sandbox Code Playgroud) 我试图编写一个函数来从Python中的列表中删除重复项.
但是在我这样做之后,我发现列表是通过将其转换为set并返回列表来排序的.
这是脚本:
>>> l = [9,10,10,11,1,1,1,22,2,2,2]
>>> s = set(l)
>>> s
set([1, 2, 9, 10, 11, 22])
>>> l2 = list(s)
>>> l2
[1, 2, 9, 10, 11, 22]
>>> l2 = list(set(l))
>>> l2
[1, 2, 9, 10, 11, 22]
>>>
Run Code Online (Sandbox Code Playgroud)
s订购该套装(至少在打印时订购).
订购的原因是什么?
如果我通过运行以下方法删除重复项,那么时间复杂度是多少:
def remove_duplicates(nums):
return list(set(nums))
Run Code Online (Sandbox Code Playgroud) 在Python3中,我写了一个简单的一行代码,如下所示:
{ 2*x for x in {1,2,3,4} }
Run Code Online (Sandbox Code Playgroud)
但我得到这样的答案(订单改变了).
{8, 2, 4, 6}
Run Code Online (Sandbox Code Playgroud)
为什么我得到答案{8,2,4,6}而不是{2,4,6,8}?
我想连续打印集合的元素,所以我编写了以下代码:
s='dmfgd'
print(set(s))
Run Code Online (Sandbox Code Playgroud)
但是,此代码显示的输出为:
set(['m', 'd', 'g', 'f'])
Run Code Online (Sandbox Code Playgroud)
但是,我想要的输出如下:
set(['d','m','f','g'])
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
这是问题:
实现函数processList2(inputList, specialItem, ignoreItems),该函数返回一个新列表,其中包含inputList(按原始顺序)的所有项目,但以下各项除外
ignoreItemsspecialItem(如果specialItem不是ignoreItems)应该成为串"special"在新的清单。我试图通过inputList使用列表理解来创建一个新列表。我可以items not in ignoreItems,但似乎无法弄清楚if的打印方式item == specialItem。
这是我到目前为止的内容:
def processList2(inputList, specialItem, ignoreItems):
return [item for item in inputList if item not in ignoreItems]
Run Code Online (Sandbox Code Playgroud)
样本输出类似于:
>>> processList2([1,1,2,2], 1, [2])
['special', 'special']
Run Code Online (Sandbox Code Playgroud)
要么
>>> processList2([1,2,3,4,True,'dog'], 4, [3,5,4])
[1, 2, True, 'dog']
Run Code Online (Sandbox Code Playgroud) 我发现了一些set在Python 中使用s的代码.我试图用列表模拟它们,但是当我pop()从它们那里得到不同的结果时!
我打开了Ipython来测试这些东西是如何工作的,并发现了一些非常奇怪的东西:
In [16]: x
Out[16]: set([])
In [17]: x.add("a")
In [18]: x.add("b")
In [19]: x.add("c")
In [20]: x
Out[20]: set(['a', 'c', 'b'])
Run Code Online (Sandbox Code Playgroud)
不应该'b'来c 之前,因为它之前是添加的吗?我不明白这一点.
>>> nums = {n**2 for n in range(10)}
>>> nums
{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么数字出了问题?它不应该是{0,1,4,9 ......}吗?