我正在将.csv文件读入列表并附加一个空列表,我正在使用下面的代码来执行此操作。
with open('Scores.csv', 'r') as scores:
reader = csv.reader(scores)
tscores = [[str(e) for e in r] for r in reader]
它正确地创建了一个嵌套列表列表,但在每行读入后附加一个空列表,如下所示:
[[score1, name1], [], [score2, name2], []]
我相信它正在读取\n
作为一个空字符串,这就是我得到它的原因,所以我尝试使用以下方法删除空列表:
tscores = [tscores.remove(x) for x in tscores if x]
会删除空的嵌套列表,但会将包含数据的所有其他嵌套列表设置为None
,即[None, None]
。我修改为:
tscores = [tscores.remove(x) for x in tscores if []]
完全消除所有嵌套列表。
如何在不附加空列表的情况下读取具有相同输出(嵌套列表列表)的文件,或者如何在读入后删除所有空列表?
答案 0 :(得分:1)
我认为你想要做的是
tscores = [x for x in tscores if x != []]
只列出tscores中的无空列表
答案 1 :(得分:1)
替代user2990008's answer,您无法首先创建空列表:
#include "GLheaders.h"
void drawWorldAxis() {
glLoadIdentity();
glBegin(GL_LINES);
glNormal3f(0, 0, 1);
glColor3ub(255, 0, 0);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glColor3ub(0, 255, 0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glColor3ub(0, 0, 255);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
glEnd();
}
void keyboard(unsigned char key, int x, int y) {
glutPostRedisplay();
}
static float eye[3] = {.5, .5, .5};
#include <stdio.h>
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0, 1, .1, 10000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
drawWorldAxis();
printf("eye at <%f, %f, %f>\n", eye[0], eye[1], eye[2]);
fflush(stdout);
gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0);
eye[0] += .1;
eye[1] += .1;
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0, 1, -1, 10000);
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE| GLUT_DEPTH);
glutInitWindowSize(400,400);
glutCreateWindow("Tiny Test");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return EXIT_SUCCESS;
}
答案 2 :(得分:1)
只是为了完整性:在这种情况下,我认为列表推导不是最简单的解决方案。这里的函数式编程很有意义,imho。
To&#34;自动&#34;迭代列表并过滤特定元素,您可以使用内置函数filter:
In [89]: a = [ [1, 2], [], [3, 4], [], [5, 6], [], [], [9, 5, 2, 5]]
In [91]: filter(lambda x: len(x) > 0, a)
Out[91]: [[1, 2], [3, 4], [5, 6], [9, 5, 2, 5]]
列表x
的每个元素a
都传递给lambda
函数,并且当且仅当条件{{时,返回的列表才包含a
元素符合1}}。因此,返回没有嵌套空列表的列表。
答案 3 :(得分:0)
我不确定我是否正确理解了您的问题,但您可以使用以下内容从列表列表(或元组列表或其他序列列表)中删除空条目:
#/bin/python
# ...
with open('Scores.csv', 'r') as scores:
reader = csv.reader(scores)
tscores = [[str(e) for e in r] for r in reader if len(r)]
...请记住,列表推导可以处理可选的条件子句进行过滤。这只有在你可以确保你正在遍历的列表的每个元素都支持 len()函数时才会起作用(当然你可以通过使用更复杂的条件来确保这一点,例如: hasattr(r,' len ')和len(r)
注意:这只测试一个级别的深度...它不递归。
答案 4 :(得分:0)
tscores = [x for x in tscores if x]
如果列表为空,则条件将返回false,因此不会包含在tscores
中。