相关疑难解决方法(0)

从python中的列表中获取唯一值

我想从以下列表中获取唯一值:

['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)

我应该使用更好的解决方案吗?

python

701
推荐指数
17
解决办法
138万
查看次数

在python3.6中,集合的顺序是像dicts一样

由于dictPython 3.6 中的实现发生了变化,现在默认排序.现在还set保留秩序吗?

我找不到任何关于它的信息,但由于这两种数据结构在它们工作的方式非常相似,我认为可能就是这种情况.

我知道dict在所有情况下都无法订购s,但它们大多数情况下都是如此.如Python文档中所述:

这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖它

python cpython set python-internals python-3.6

30
推荐指数
2
解决办法
6716
查看次数

为什么 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 cpython set

30
推荐指数
2
解决办法
1996
查看次数

使用Python的设置差异时保留顺序

我正在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以原始格式保留列表?

python set

14
推荐指数
3
解决办法
2万
查看次数

集合中的插入顺序(解析{}时)

有人问这里时,把原因1Trueset1被保留.

这当然是因为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 set python-internals

11
推荐指数
1
解决办法
367
查看次数

Python中有sorted()的神奇方法吗?

我知道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 oop magic-methods

7
推荐指数
1
解决办法
8751
查看次数

为什么在将列表转换为set时订购该集合?

我试图编写一个函数来从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)

python list set

5
推荐指数
1
解决办法
108
查看次数

在python中设置理解

在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}

python set

1
推荐指数
2
解决办法
988
查看次数

在python中打印集合的元素

我想连续打印集合的元素,所以我编写了以下代码:

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)

任何帮助将不胜感激。

python set python-3.x

0
推荐指数
1
解决办法
3万
查看次数

列出3个参数的理解和语法错误

这是问题:

实现函数processList2(inputList, specialItem, ignoreItems),该函数返回一个新列表,其中包含inputList(按原始顺序)的所有项目,但以下各项除外

  1. 删除列表中出现的所有内容 ignoreItems
  2. 的出现specialItem(如果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)

python list-comprehension

0
推荐指数
1
解决办法
71
查看次数

请解释集的顺序

我发现了一些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 之前,因为它之前是添加的吗?我不明白这一点.

python set

-1
推荐指数
2
解决办法
215
查看次数

为什么在一个范围内调用n ^ 2会产生无序的结果?

>>> 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 ......}吗?

python

-2
推荐指数
1
解决办法
58
查看次数