【问题标题】:Iterating over a list of lists with a conditional formulas in Python在 Python 中使用条件公式迭代列表列表
【发布时间】:2014-05-20 04:59:21
【问题描述】:

我有如下三个输入列表:

fill_rgn_pts = [[0,1,2,3,4,5,6,7],[0,1,2,3,4,5],[0,1,2,3],[0,1,2,3]]
fill_rgn = [[region1],[region2],[region3],[region4]]
rooms = [[room1],[room2],[room3],[room4],[room5],[room6]]

我正在尝试根据房间内是否包含所有 fill_rgn_pts 来配对 fill_rgn 和房间。到目前为止,这是我尝试过的:

valid_rooms, valid_fill_rgn, invalid_rooms = [], [], []

for i in rooms:
    for list, region in zip(fill_rgn_pts, fill_rgn):
        if all(i.IsPointInRoom(j) == True for j in list):
            valid_rooms.append(i)
            valid_fill_rgn.append(region)
        else:
            invalid_rooms.append(i)
OUT = valid_fill_rgn, valid_rooms, invalid_rooms

我从中得到的是三个列表:

valid_fill_rgn = [[region1],[region2],[region3],[region4]]
valid_rooms = [[room1],[room2],[room3],[room4]]
invalid_rooms = [[room1],[room1],[room1],[room2],[room2],[room2],[room3],[room3],[room3],[room4],[room4],[room4],[room4],[room5],[room5],[room5],[room6],[room6],[room6],[room6]]

前两个列表看起来正是我想要的,因为它们按照我的预期配对了一个区域和房间。然而,第三个列表返回了太多的项目。我为每个房间获得了三个额外的值,这让我觉得我正在迭代一些我不应该迭代的东西。想法?

【问题讨论】:

  • list 对于变量来说是一个糟糕的选择,因为它会影响内置的 list()
  • 好点,菜鸟的错误我会改正的。
  • regionXroomX 是什么?自定义对象?
  • 是的,房间是自定义对象,区域也是。 IsPointInRoom 是一个检查点是否包含在房间中的类(它来自 Revit API 一个 3D 建模软件)。那些运作良好。我想我在这里有一个列表理解问题。
  • @Bachmann - 除非IsPointInRoom 中的某些内容可能会返回一些真实的东西,而这在某些时候实际上并不是True。否则,我同意。

标签: python list loops iteration


【解决方案1】:

如果我正确理解您的问题,您可以通过将 invalid_roomsvalid_rooms 更改为 set 来解决此问题,这将不允许重复。

您的循环为每个点/范围对重复添加,这就是为什么您不断在 valid_roomsinvalid_rooms 列表中获得重复项。一旦房间被标记为有效或无效,您无需再次添加。

此外,您的列表似乎只有一项,[room1],最好只拥有单独的房间:

rooms = [room1,room2,room3,room4,room5,room6]

【讨论】:

  • valid_rooms, valid_fill_rgn, invalid_rooms = set(), [], set() for i in rooms: for lst, region in zip(fill_rgn_pts, fill_rgn): if all(i.IsPointInRoom(j) == True for j in lst): valid_rooms.add(i) valid_fill_rgn.append(region) else: invalid_rooms.add(i) #将输出分配给 OUT 变量 OUT = valid_fill_rgn, valid_rooms, invalid_rooms
  • 所以我将 valid_rooms 和 invalid_rooms 更改为 set() 而不是 [] 然后我使用 add() 而不是附加,但我仍然在 invalid_rooms 中获得所有相同的房间分配给 valid_rooms。
  • 现在你有一个不同的问题:)
  • 所以我添加了 invalid_rooms.difference_update(valid_rooms) 以消除重复项。现在我得到了我想要的......这是糟糕的编码吗?我想学习正确的方法。
  • 不,它的编码还不错——你为什么会这样认为?
【解决方案2】:

为什么不最后计算无效房间?

找到有效房间后

fill_rgn_pts = [[0,1,2,3,4,5,6,7],[0,1,2,3,4,5],[0,1,2,3],[0,1,2,3]]
fill_rgn = [[region1],[region2],[region3],[region4]]
rooms = [[room1],[room2],[room3],[room4],[room5],[room6]]

for i in rooms:
    for list, region in zip(fill_rgn_pts, fill_rgn):
        if all(i.IsPointInRoom(j) == True for j in list):
            valid_rooms.append(i)
            valid_fill_rgn.append(region)

invalid_rooms = [room for room in rooms if room not in valid_rooms]
OUT = valid_fill_rgn, valid_rooms, invalid_rooms

【讨论】:

    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 2018-10-12
    • 2021-05-02
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    相关资源
    最近更新 更多