本问题已经有最佳答案,请猛点这里访问。

我正在为锦标赛应用程序编写循环算法。

当玩家数量为奇数时,我将'DELETE'添加到玩家列表中,但稍后,当我想从包含'DELETE'的日程表列表中删除所有项目时,我不能——总是留下一个。请看一下代码——问题很简单,我想是关于列表的;我就是看不到。

"""

Round-robin tournament:

1, 2, 3, 4, | 5, 6, 7, 8    =>  1, 2, 3, 4  => rotate all but 1 =>  1, 5, 2, 3  => repeat =>    1, 6, 5, 2  ...

5, 6, 7, 8              6, 7, 8, 4          7, 8, 4, 3

in every round pick l1[0] and l2[0] as first couple, after that l1[1] and l2[1]...

"""

import math

lst = []

schedule = []

delLater = False

for i in range(3):                  #make list of numbers

lst.append(i+1)

if len(lst) % 2 != 0:               #if num of items is odd, add 'DELETE'

lst.append('DELETE')

delLater = True

while len(schedule) < math.factorial(len(lst))/(2*math.factorial(len(lst) - 2)): #!(n)/!(n-k)

mid = len(lst)/2

l1 = lst[:mid]

l2 = lst[mid:]

for i in range(len(l1)):

schedule.append((l1[i], l2[i]))         #add lst items in schedule

l1.insert(1, l2[0])             #rotate lst

l2.append(l1[-1])

lst = l1[:-1] + l2[1:]

if delLater == True:                #PROBLEM!!! One DELETE always left in list

for x in schedule:

if 'DELETE' in x:

schedule.remove(x)

i = 1

for x in schedule:

print i, x

i+=1

schedule[:] = [x for x in schedule if 'DELETE' not in x]

请参阅有关在迭代列表时从列表中删除的其他问题。

+1用于使用[:]仅修改同一列表对象。

为什么要使用就地分配?@麦晋桁可能没有什么好处。它短暂地节省了一点内存,而且速度慢了一点。很可能两者都不重要。

@AGF:只需尽可能少地修改现有代码。就个人而言,我只需要在任何地方使用生成器,或者编写一个不需要伪条目的算法,但这不是问题所在。

@AGF可读性。引入另一个列表对象将引入在读取代码时要记住的另一个变量。

@迅猛龙物体身份有什么关系?您仍然可以使用相同的名称,不需要新的变量:schedule = [x for x in schedule if 'DELETE' not in x]。

@agf:当必须保持所有绑定到列表的名称同步时,使用就地分配。

要在遍历列表时从列表中删除元素,需要向后:

if delLater == True:

for x in schedule[-1::-1]):

if 'DELETE' in x:

schedule.remove(x)

更好的选择是使用列表理解:

schedule[:] = [item for item in schedule if item != 'DELETE']

现在,你可以用schedule =代替schedule[:] =,有什么区别?一个例子是:

schedule = [some list stuff here]  # first time creating

modify_schedule(schedule, new_players='...') # does validation, etc.

def modify_schedule(sched, new_players):

# validate, validate, hallucinate, illustrate...

sched = [changes here]

此时,modify_schedule所做的所有更改都已丢失。为什么?因为它没有就地修改列表对象,而是将名称sched重新绑定到一个新列表,使原始列表仍然绑定到调用方的名称schedule。

因此,您是否使用list_object[:] =取决于您是否希望将任何其他名称绑定到您的列表以查看更改。

在正确的设计中,def返回分配回schedule的sched,或者以一种被认为是不好的形式,但逻辑设计,您没有通过计划,而是使用global schedule。无论您是否使用就地分配,上面的示例设计都是错误的,因为在您更改schedule时,不清楚sched和schedule指的是相同的东西。

还有,你试过你的循环版本吗?我不知道它应该如何工作,但至少有几个错误。您试图删除列表中不知道的内容(enumerate中的索引),而您的切片值似乎没有意义。

这不是使用slices反转列表的正确方法,请尝试schedule[-1::-1],或者更好的方法是reversed(schedule),因为slice无论如何都会构建一个新的列表。

@f.j类似于for _ in range(sum('DELETE' in x for x in schedule)): schedule.remove(x)的东西也可以工作——因为remove无论如何都会进行搜索,所以您实际上只是使用匹配的数量,而不是它们的位置,所以只需取消这两个操作的同步,即使您想使用循环,也无需反向操作。

@F.J:啊,谢谢。固定的。

@阿格夫:不,不幸的是——我的主要观点是驳斥你的说法,即[:]是不必要的,是浪费时间。循环版本已修复,谢谢。

@AGF:所以把调用站点改为schedule[:] = modify_schedule(schedule, ...)--我的观点仍然是多个名称绑定到一个列表对象,并决定是否保持同步。

代码与schedule[:]=[x对于schedule中的x,如果'delete'不在x]中,则可以正常工作。我对python和编程是个新手,所以总的来说有一些错误,希望我能了解更多,这样我就可以讨论它们了。感谢大家的帮助。

在对列表进行迭代时,不应修改该列表:

for x in schedule:

if 'DELETE' in x:

schedule.remove(x)

相反,尝试:

schedule[:] = [x in schedule where 'DELETE' not in x]

有关详细信息,请参见在迭代时从列表中删除项

没有必要从其他答案中复制原位作业,这并不好。

谢谢你的回答和信息。老实说,我仍然不知道如何正确地询问关于Python的问题,也不知道在哪里寻找答案。我不知道在迭代过程中删除项目是不同的。

@罗迪克:我很高兴。这个问题是每个Python编码人员迟早会遇到的问题。

@agf:如果不使用[:]会产生错误,那么使用它会更好。详情请参阅我的答案。

不要修改正在迭代的序列。

schedule[:] = [x for x in schedule if 'DELETE' not in x]

python里面列表可以同时删除吗_在python中从列表中删除项,同时对其进行迭代相关推荐

  1. python编程快速上手第四章_《Python编程快速上手——让繁琐的工作自动化》读书笔记 第四章 列表...

    接下来我们来学习 python 中的列表(有点像 Java 中的数组,但并不是数组) "列表"是一个值,它包括多个字构成的序列,术语"列表值"指的是列表本身(它 ...

  2. python一到10整数的平方和_零基础学python_10_列表(创建数值列表 )

    创建数值列表 需要存储一组数字的原因有很多,例如,在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分.在数据可视化中,处理的几乎都是由数字(如温度.距离.人口数量.经度和纬度等)组成的 ...

  3. python将对象放入列表根据某个属性排序_关于python:如何根据对象的属性对对象列表进行排序?...

    我有一个python对象列表,我想按对象本身的属性排序.列表如下: >>> ut [, , , , , , ...] 每个对象都有一个计数: >>> ut[1].c ...

  4. python元组和列表都支持的方法_(3)python 列表和元组

    列表 元组 字段 等都是一种数据结构.其中列表和元组比较相似都是顺序保存的,都可以通过索引来找到元素. 列表和元组的主要区别:列表是可以修改的,元组不可以修改.列表用[]表示,元组用()表示 一.列表 ...

  5. python删除失败_对python 各种删除文件失败的处理方式分享

    对python 各种删除文件失败的处理方式分享 调用python提供的各种删除文件的操作均失败 返回值5,拒绝访问,但是多次确认文件没有被打开,文件是从一个zip包中解压出来后,没有任何打开读写等操作 ...

  6. python模拟登录qq获取好友信息_使用Python模拟登录QQ邮箱获取QQ好友列表

    最近因开发项目的需要,有一个需求,就是很多SNS网站都有的通过 Email地址 导入好友列表,不过这次要导入的不是Email 列表,而是QQ的好友列表. 实现方式: 通过google一搜,实现的方式大 ...

  7. python对数据进行合并的函数_利用Python pandas对Excel进行合并的方法示例

    前言 在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下. 博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大 ...

  8. python四位玫瑰数的解题思路_入门python知识点总结以及15道题的解题思路分析

    知识点总结python 1.序列app 操做符ide x in s 若是x是列表s的元素,返回True,不然False s + t 链接两个序列s和t s*n或者n*s 将序列s复制n次 s[i] 返 ...

  9. python数据可视化从入门到实战_《Python编程从入门到实践》json数据可视化练习详解...

    <Python编程从入门到实践>16.2中,计算收盘价均值的程序有些不易看懂,结合我自己的理解进行一些说明. 使用的数据集:join格式的数据, 数据集是由多个字典为元素组成的列表.每个字 ...

  10. python基础面试都问什么问题_基本 Python 面试问题

    def Stack(object): def __init__(self): self.stack = [] def push(self,value): # 进栈 self.stack.append( ...

最新文章

  1. AQS独占式获取同步状态和释放同步状态(源码阅读笔记)
  2. linux做成service服务器,Zabbix2.0.3做成Service
  3. C语言实现珠排序bead sort算法(附完整源码)
  4. cocos2dx 响应windows键盘事件
  5. 洞仙歌·冰肌玉骨 [宋] 苏轼
  6. 如何发布第一个属于自己的npm包
  7. Android 中 liblog 和 libcutils 的编译 trick
  8. 找出数组中只出现过一次的数
  9. 字体编辑器_三款好用的字体编辑器分享,让您拥有属于自己的字体
  10. 你们知道为什么数据库的交互技术要叫JDBC吗?
  11. 如何使用 python 爬取全国小区名称
  12. 什么是Web应用程序防火墙?
  13. Nike Zoom KD 5 “OKC / Away” colorway
  14. ZCMU--1585: 面试
  15. 电脑中如何打开进程管理器?
  16. 解决360/google翻译不能用的问题
  17. python爬虫获取网站销售情况(内置源码)
  18. 用html怎样实现抽奖效果,html5+css3实现抽奖活动的效果
  19. 大数据基础——HDFS(分布式文件系统)
  20. 【深圳】大湾区第三次.NET技术交流会(网络直播)

热门文章

  1. 计算机 无法进入睡眠模式,win10电脑无法进入睡眠模式怎么解决
  2. 刚才玩了下Steganos Internet Anonym,IP伪装器,每一秒自动换一IP
  3. 玩客云小盒子安装点心云,实现闲置宽带共享。
  4. 两个网段共享打印机_两个网段打印机共享
  5. ubuntu设置宽带连接及wifi共享
  6. mysql a foreign key constraint fails_外键记录有存在,插入数据却报错a foreign key constraint fails...
  7. MATLAB 三维画图
  8. org.hibernate.MappingException: Unknown entity常见问题(新手需注意)
  9. iOS蚂蚁森林的loading效果
  10. python调用报表制作工具_Python如何使用xlwt制作一个表格