作为python的首发,在遇到问题时试图从聪明人那里获得帮助。 那是现在:

我必须从一个列表中相互比较项目(Qt场景项目),并且使相互冲突的项目组合在一起。

请帮我代码:

class MainWin(QMainWindow):
    def __init__(self):
        super(MainWin, self).__init__()
        self.Win()
        self.L = self.buildAllWalls()
        items = self.scene.items()
        allGroups = groupItemsFromList(None, items)
        self.paintGroups(allGroups)
        print len(allGroups)

    def paintGroups(self, groups):
        for g in groups :
            color = QColor(0, 0, 0)
            # RANDOM COLOR
            namcol = "#%s" % "".join([hex(randrange(0, 255))[2:] for i in range(3)])
            color.setNamedColor(namcol)
            while color.isValid() == False :   #   ERROR CHECK
                namcol = "#%s" % "".join([hex(randrange(0, 255))[2:] for i in range(3)])
                color.setNamedColor(namcol)
            pen = QPen(color, 14, Qt.SolidLine)
            for w in g :
                w.setPen(pen)

    def Win(self):
        self.scene = QGraphicsScene()
        self.sView = QGraphicsView(self.scene)
        self.sView.setRenderHint(QPainter.Antialiasing)
        self.sView.setAlignment( Qt.AlignLeft | Qt.AlignTop )

        self.setCentralWidget(self.sView)
        self.setGeometry(20, 380, 400, 300)
        self.show()

    def buildAllWalls(self):
        data = self.wallCoordinates()
        for p in range(len(data)) :
            ptA = QPointF(data[p][0], data[p][1])
            ptB = QPointF(data[p][2], data[p][3])
            self.wall(ptA, ptB)

    def wall(self, ptA, ptB):
        pen = QPen(QColor(100, 100, 100), 14, Qt.SolidLine)
        currL = self.scene.addLine(QLineF(ptA.x(), ptA.y(), ptB.x(), ptB.y()))
        currL.setPen(pen)
        return currL

    #[50,75,325,75],
    def wallCoordinates(self):
        data = [[50,100,150,100],[175,200,125,200],[175,275,125,275],[175,275,175,200],
            [150,150,150,100],[175,100,225,100],[250,100,325,100],[350,125,175,125],
            [50,125,125,125],[125,175,125,125],[150,150,175,150],[175,150,175,200],
            [50,150,100,150],[100,150,100,200],[100,200,125,200],[50,175,75,175],
            [75,225,75,175],[75,225,125,225],[125,275,125,225]]
        return data

def main():

    app = QApplication(sys.argv)
    ex = MainWin()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

===============>>#1 票数:1 已采纳

我是这样写的:

def groupItemsFromList(self, itemList):
    tmp = itemList[:]
    allGroups = []
    while tmp:
        it = tmp.pop(0)  
        currentGroup = [it]
        # loop from back to front so we can remove items safely
        for i in range(len(tmp)-1, -1, -1):
            if it.collidesWithItem(tmp[i]):
                currentGroup.append(tmp.pop(i))
        allGroups.append(currentGroup)
    return allGroups

例如:

class Test(object):
    def __init__(self, key):
        self.key = key
    def collidesWithItem(self, other):
        return isinstance(other, self.__class__) and self.key == other.key
    def __repr__(self):
        return '{0}({1})'.format(self.__class__.__name__, self.key)

example = [Test(1), Test(2), Test(1), Test(1), Test(3), Test(2), Test(3), Test(4)]
print groupItemsFromList(None, example)

输出:

[[Test(1), Test(1), Test(1)], [Test(2), Test(2)], [Test(3), Test(3)], [Test(4)]]

这假设所有与物品碰撞的物品也会相互碰撞。

编辑:听起来假设无效,请尝试以下(未经测试):

def groupItemsFromList(self, itemList):
    tmp = itemList[:]
    allGroups = []
    while tmp:
        it = tmp.pop(0)  
        currentGroup = [it]
        i = len(tmp) - 1
        while i >= 0:
            if any(x.collidesWithItem(tmp[i]) for x in currentGroup):
                currentGroup.append(tmp.pop(i))
                i = len(tmp) - 1
            else:
                i -= 1
        allGroups.append(currentGroup)
    return allGroups

===============>>#2 票数:1

看起来你可以这样做:

 
 
 
  
  def groupItemsFromList(self, itemList): """ Make a list of lists, where each list is composed of the items (excepting itself, of course) that an item collides with. """ return [ [item for item in itemList[:i] + itemList[i:] if item.collidesWithItem(x)] for i, x in enumerate(itemList) ]
 
  

itemList[:i] + itemList[i:]是“我想要除了第i个项目之外的原始列表的所有元素”的python习语。


后来:我明白了。 你想要更像这样的东西:

def groupItemsFromList(self, itemList):
    def collision_indexes(i, target):
        return [i] + [j for j, item in enumerate(itemList[i + 1:], start=i + 1) if item.collidesWithItem(target)]

    processed = set()
    results = []
    for i, target in enumerate(itemList):
        if i not in processed:
            indexes = collision_indexes(i, target)
            processed.update(indexes)
            results.append([itemList[j] for j in indexes])
    return results

这里唯一的优点是这是无副作用的代码。 原始数据没有变异,只有应用于数据的函数和对新的临时数据结构所做的更改。

  ask by Alex translate from so

未解决问题?本站智能推荐:

2回复

在python中暂停循环

我有一个循环,该循环使用PySide创建窗口,具体取决于用户输入的数量,每个窗口都会调用其他函数。 我希望在所有属于第一个窗口的命令完成后打开第二个窗口。 因此,例如,Python中有没有办法告诉循环停止,直到某个标志为True 这就是我在做什么 现在在该函数中,该窗口对其
1回复

检查Python列表中的成员资格问题

我在列表中遇到了项目成员资格的问题,我无法理解。 检查列表中的某个对象实例(带有简单的“列表中的项目”)时,即使实例在列表中,它也会返回False。 然后,我注意到相同的指针没有相同的ID。 我必须使用某些特殊方法还是什么? 有人可以帮我比较实例是否相等。 注意:如果很重要,所
1回复

如何在Pyside,QtPy python中从主UI到Qthread发送列表?

我用Pyside(QtPy)编写了一个应用程序。 该应用程序允许用户:1.扫描路径-应用程序将扫描默认路径并将该路径中的现有文件夹显示为复选框列表。 2.用户能够选择多个文件夹,然后对所有这些文件夹执行一个过程(按钮)。 在后台:当用户单击“处理”时,我扫描复选框列表并仅为所选文件夹(
1回复

如何用cython构建整个python项目

我有一个包含许多模块,文件和文件夹的PySide项目。 我还使用了Numpy,Matplotlib和许多其他模块。 我想用cython构建这个项目。 该代码是纯python,我希望cython将所有依赖项加在一起,就像使用pyinstaller 是否有可能或cython仅用于编写
2回复

在python中匹配多行注释

我正在尝试匹配看起来像这样的多行/块注释 “ <##>”确定块注释的开始和结束。 我在应用程序和QRegExp函数中使用PySide,如下所示: QRegExp似乎与多行注释不匹配。 我缺少某种选项或标志吗?
2回复

添加列表小部件项目异步Pyside

我正在使用gphoto2拍摄照片,并希望在拍摄照片时将它们异步发送到列表小部件,但由于某种原因,它无法正常工作。 它会在QThread上拍摄照片,但是直到所有照片都拍摄完毕(例如批量添加)后,才将照片添加到列表中。 我将如何处理? 这是相关的源代码(由于存在太多依赖关系,因此无法编译)
1回复

我在哪里可以找到所有PyQT / PySide信号的列表? [关闭]

在Google上找不到它,在doc中找不到它。 现在,我找到信号的唯一方法是阅读每个小部件文档。 有这样的事吗?
1回复

如何在PyQt / PySide中将QComboBox设置为项目文本中的项目

是否可以将QComboBox设置为仅知道项目文本值的项目? 我试图避免for i in range(myCombobox.count())循环查找,只是为了查找项目的索引,以便可以将其用于设置当前索引。
1回复

在Python中狭窄的QWidget中添加QScrollBar

更新上一个问题。 显示时看起来局促,请参见下面的照片。 我想将QWidget(面板)保持相同的高度,并在其右侧添加QScrollBar,以便使小部件保持其自然大小,并且用户可以向下滚动 我尝试添加此代码。 但是该代码运行了,但是甚至没有GUI打开,所以我手动从命令
3回复

Python中的Qt / C ++原型

我想用Qt编写一个C ++应用程序,但是首先使用Python构建一个原型,然后逐渐用C ++替换Python代码。 这是正确的方法,我应该使用哪些工具(绑定,绑定生成器,IDE)? 理想情况下,所有内容都应该在Ubuntu存储库中可用,因此我不必担心不兼容或旧版本,并且使用简单的apt