python - 如何根据原始列表相同的值但不同的索引创建新列表
问题描述
我在 Python 中使用Pyqt5创建了一个 GUI 界面,它导入一个 Excel 文件并将其列显示为listWidget中的项目。用户可以在其中检查项目,每个检查的项目都附加到new_list。
问题是,如果我有以下示例:
original_list = ["a","b","c","d","e","f"]
如果用户为新列表选择以下项目:
“C”、“f”、“a”
结果:
new_list = ["a","c","f"]
预期结果:
new_list = ["c","f","a"]
在此图像中,用户在索引 0 的项目之前选择索引 3 的项目:
但是new_list将索引 0 的项目附加到索引 3 的项目之前
代码:
from PyQt5 import QtCore, QtGui, QtWidgets
import os
import pandas as pd
import numpy as np
import chardet
class Ui_MainWindow(QtWidgets.QMainWindow):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.header_list = QtWidgets.QListWidget(self.centralwidget)
self.header_list.setMaximumSize(QtCore.QSize(120, 1667))
self.header_list.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.header_list.setObjectName("header_list")
self.header_list.itemChanged.connect(self.selectionChanged)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
self.menubar.setObjectName("menubar")
self.menufile = self.menubar.addMenu("File")
self.menufile.setObjectName("menufile")
self.menuimportfile = QtWidgets.QAction("Import File",self.menufile)
self.menuimportfile.setObjectName("importfile")
self.menuimportfile.triggered.connect(lambda:self.loadFile())
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menufile.addAction(self.menuimportfile)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menufile.setTitle(_translate("MainWindow", "file"))
def loadFile(self):
try:
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open File", "", "Excel Files (*.csv *.xls *.xlsx)");
print(fileName)
name, ext = os.path.splitext(fileName)
print("name: {} ".format(name))
print("ext: {} ".format(ext))
if ext == ".csv":
with open(fileName, 'rb') as rawdata:
result = chardet.detect(rawdata.read(100000))
print(result)
df = pd.read_csv(fileName,encoding = result["encoding"])
elif ext == ".xls" or ext == ".xlsx":
df = pd.read_excel(fileName)
self.df = df
#part that display items in the qlistWidget
self.header_list.clear()
savelist = list(self.df)
for item in savelist:
qitem = QtWidgets.QListWidgetItem ( )
qitem.setText ( item )
qitem. setFlags ( QtCore. Qt . ItemIsUserCheckable | QtCore. Qt . ItemIsEnabled )
qitem.setCheckState ( QtCore.Qt.Unchecked )
self.header_list.addItem ( qitem )
except Exception as e:
print("error is {}".format(e))
def selectionChanged(self):
self.checked = []
for row in range(self.header_list.count()):
item = self.header_list.item(row)
#need to be checked in order to display the item in the order that the user choose.
if item.checkState():
if item in self.checked:
del self.checked[item]
else:
# if not item in self.checked:
self.checked.append(item)
# checked.insert(len(checked)-1,item)
print("Checked items: ", ", ".join(i.text() for i in self.checked))
self.checked = [i.text() for i in self.checked]
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
解决方案
看起来selectionChanged
可以是下面的行。
只需迭代并收集选中的项目。
def selectionChanged(self):
self.checked = [self.header_list.item(row) for row in range(self.header_list.count()) if self.header_list.item(row).checkState()]
推荐阅读
- tensorflow - 数据集中张量的 ref() 不相等。为什么?
- c# - 如何在反序列化之前从 json 字符串中删除元素?
- javascript - IIS ASP NET Core 上的微调器加载失败
- c# - 每当刷新数据网格时向上移动垂直滚动条
- c# - 在 C# 中对数组进行排序,除了一个数字
- paypal - 如何添加贝宝购物篮?
- drupal - Drupal9 自定义模块
- uwp - UWP - 多语言:在运行时更改语言字符串
- python - Python子进程解码特殊字符
- python - 有什么方法可以在 Windows 10(32 位)中使用 32 位 python3 使用 64 位模块?