【问题标题】:Python - How to check values in a sublistPython - 如何检查子列表中的值
【发布时间】:2012-11-09 01:09:23
【问题描述】:

我正在尝试将子列表附加到相同类型子列表的较大列表中。

子列表:

[x-value,y-value, i, 100]

但是,我希望我的代码在添加之前检查是否已经存在具有相同 x 值和 y 值的子列表,因此在这种情况下,我没有重叠的树(不要'别问)。

这就是我构建列表的方式:

food = []
 for i in range(amount): 
        food.append([
            randint(100, 700), #X
            randint(100, 700), #Y
            i, #identifier
            100]) #energy

【问题讨论】:

  • 我只会使用一个字典,其中(x,y) 元组作为键,[id, energy] 作为值。
  • 感觉这个问题是在找人写代码,这是一个解决方案……这在 StackOverflow 上通常是不鼓励的。如果您提出更具体的问题(例如,“如何确定列表是否包含重叠值?”),您可能会更幸运。

标签: python list for-loop iterator


【解决方案1】:

除了使用“in”之外,或者按字典顺序对它们进行排序的字典可能是更好的方法。然后使用 2D 二进制搜索来查找您要查找的内容。

虽然这可能仅在您期望有大量重复项时才有用,否则简单的线性搜索就足够了。

注意:最初建议按距离排序,经过思考,这种排序在这种情况下并不是很有帮助。

【讨论】:

  • 距离的顺序与距离平方的顺序相同,所以排序不需要取sqrt
  • 谢谢,它原本是 math.sqrt((x1-x2) ** 2 - (y1-y2) ** 2。将其更改为只允许使用距离函数.
  • 改为字典排序。
【解决方案2】:
food = []
for i in range(amount):
    x,y = randint(100, 700),randint(100, 700)
    value = [x,y,i,100]
    if  all([True if x[0]!=x and x[1]!=y else False for x in food]): #check for duplicated x,y
        food.append(value)

【讨论】:

  • 是的,我只是意识到现在没有正确阅读问题将尝试提出解决方案
  • 首先我想我也这么认为...使用字典作为@Platinum Azure 可能是最好的方法
  • 这就是我的想法(请参阅答案下方的评论),在 PlatinumAzure 发布他/她的答案前五分钟;)
  • @NullUserException 是的,我的回答受到了启发 ;-) 你本可以打败我,但是......你没有:-P
【解决方案3】:

如果您试图确保 (x, y) 值的唯一性并且您有数据与它们相关联,那么这是字典的完美用例:

food = {}
for i in range(amount):
    coords = randint(100, 700), randint(100, 700)
    if coords not in food:
        food[coords] = [
            i,   #identifier
            100, # energy
        ]

【讨论】:

  • 谢谢,因为我的编程课程很杂乱,我们还没有完成字典,但我意识到我应该提前阅读它们。这似乎很好地解决了我的问题,非常感谢您的快速回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多