删除空的嵌套列表 - Python

时间:2015-11-01 23:46:30

标签: python list nested-lists python-3.5

我正在将.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 []]

完全消除所有嵌套列表。

如何在不附加空列表的情况下读取具有相同输出(嵌套列表列表)的文件,或者如何在读入后删除所有空列表?

5 个答案:

答案 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中。