有序集Python 2.7

如何解决有序集Python 2.7

| 我有一个尝试从中删除重复项的列表。我正在使用python 2.7.1,因此我可以简单地使用set()函数。但是,这重新排列了我的列表。对于我的特殊情况,这是不可接受的。 下面是我编写的函数;做到这一点。但是我想知道是否有更好/更快的方法。此外,对此的任何评论将不胜感激。
    def ordered_set(list_):

        newlist = []
        lastitem = None
        for item in list_:

            if item != lastitem:
                newlist.append(item)
                lastitem = item

        return newlist
上面的函数假定所有项目都不是None,并且项目按顺序排列(即[\'a \',\'a \',\'a \',\'b \',\' b \',\'c \',\'d \']) 上面的函数返回[\'a \',\'a \',\'a \',\'b \',\'b \',\'c \',\'d \']作为[\ 'A B C D\']。     

解决方法

        使用OrderedDict:
from collections import OrderedDict

l = [\'a\',\'a\',\'b\',\'c\',\'d\']
d = OrderedDict()

for x in l:
    d[x] = True

# prints a b c d
for x in d:
    print x,print
    ,        另一个非常快速的set方法:
def remove_duplicates(lst):
    dset = set()
    # relies on the fact that dset.add() always returns None.
    return [item for item in lst
            if item not in dset and not dset.add(item)] 
    ,        假设输入序列是无序的,这里是3解(在空间和时间上)。 它会产生一个序列,其中删除了重复项,同时以与输入序列中出现的相对顺序相同的相对顺序保留了唯一项。
>>> def remove_dups_stable(s):
...   seen = set()
...   for i in s:
...     if i not in seen:
...       yield i
...       seen.add(i)

>>> list(remove_dups_stable([\'q\',\'w\',\'e\',\'r\',\'q\',\'y\',\'u\',\'i\',\'t\',\'p\',\'e\']))
[\'q\',\'p\']
    ,        我知道这已经被回答了,但是这里是一线(加上导入):
from collections import OrderedDict
def dedupe(_list):
    return OrderedDict((item,None) for item in _list).keys()

>>> dedupe([\'q\',\'e\'])
[\'q\',\'p\']
    ,        我认为这完全可以。您将获得O(n)性能,这是您所希望的最佳结果。 如果列表是无序的,那么您将需要一个帮手
set
来包含您已经访问过的物品,但是对于您而言,则没有必要。     ,        如果您的列表未排序,那么您的问题就没有意义。 例如[1,2,1]可能变为[1,2]或[2,1] 如果列表很大,则可能需要使用SLICE将结果写回到同一列表中以节省内存:
>>> x=[\'a\',\'d\']
>>> x[:]=[x[i] for i in range(len(x)) if i==0 or x[i]!=x[i-1]]
>>> x
[\'a\',\'d\']
有关内联删除的信息,请参见在迭代时从列表中删除项目或在迭代时从列表中删除项目,而无需在Python中使用额外的内存 您可以使用的一个技巧是,如果您知道x已排序,并且知道x [i] = x [i + j],则无需检查x [i]和x [i + j]之间的任何内容(如果您不需要删除这些j值,则可以将所需的值复制到新列表中) 因此,如果集合中的所有内容都是唯一的,即您无法击败n次运算,即len(set(x))= len(x) 可能存在一种算法,它的n个比较是最坏的情况,但是可以将n / 2个比较作为它的最佳情况(如果您事先知道len(x)/ len( set(x))> 2,因为您已经生成了数据): 最佳算法可能会使用二分法搜索以分而治之的方式为每个最小值i找到最大值j。初始除法的长度可能为len(x)/近似(len(set(x)))。希望可以这样执行,即使len(x)= len(set(x))仍然只使用n个操作。     ,        在中描述了unique_everseen解决方案 http://docs.python.org/2/library/itertools.html
def unique_everseen(iterable,key=None):
    \"List unique elements,preserving order. Remember all elements ever seen.\"
    # unique_everseen(\'AAAABBBCCDAABBB\') --> A B C D
    # unique_everseen(\'ABBCcAD\',str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in ifilterfalse(seen.__contains__,iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element
    ,        对我来说还不错。如果您真的想使用集合,请执行以下操作:
def ordered_set (_list) :
    result = set()
    lastitem = None
    for item in _list :
        if item != lastitem :
            result.add(item)
            lastitem = item
    return sorted(tuple(result))
我不知道您将获得什么性能,应该进行测试;可能由于方法过热而相同! 如果您真的像我一样偏执,请阅读以下内容: http://wiki.python.org/moin/HowTo/Sorting/ http://wiki.python.org/moin/PythonSpeed/PerformanceTips 只是想起了这个(它包含答案): http://www.peterbe.com/plog/uniqifiers-benchmark     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res