将List Comprehension用于缺少K个条目的列表行(python)

时间:2017-05-25 19:06:25

标签: python list python-3.x list-comprehension

下午。我目前正在尝试使用列表推导来返回没有完整信息的列表行。我的列表是从字符串值排列的,类似于:

mylist = [['a', 'b', 'c',  'd'],
          ['b', '',  '',   'k'],
          ['',  '',  '',   'l'],
          ['1', '2', '',   '4'],
          ['6', '',  '10', '9'],
          ['6', '',  '',   '10']]

我想对这个文档进行排序并返回缺少任何1个值的行,其中缺少任何两个值,依此类推等等任意数字k,如下所示:

listwithoneelementmissing = [['6', '', '10', '9']]

listwithtwomissing = [['b', '', '', 'k'],
                      ['6', '', '', '10']]

listwiththreemissing = [['', '', '', 'l']]

我想有一个更优雅的方法来做到这一点,而不是手工写出每个k选择n子集然后使用列表理解。谢谢!

2 个答案:

答案 0 :(得分:1)

我创建了一个函数,它返回空的数字'给定列表中的值:

def count_empty(l):
    return sum(1 for v in l if not v)

然后,您可以使用它来对列表进行分区:

def partition_on_empty_count(rows):
    per_empty_count = {}
    for row in rows:
        per_empty_count.setdefault(count_empty(row), []).append(row)
    return per_empty_count

您现在拥有从空计数到匹配列表的映射:

>>> mylist = [['a', 'b', 'c',  'd'],
...           ['b', '',  '',   'k'],
...           ['',  '',  '',   'l'],
...           ['1', '2', '',   '4'],
...           ['6', '',  '10', '9'],
...           ['6', '',  '',   '10']]
>>>
>>> partition_on_empty_count(mylist)
{0: [['a', 'b', 'c', 'd']], 2: [['b', '', '', 'k'], ['6', '', '', '10']], 3: [['', '', '', 'l']], 1: [['1', '2', '', '4'], ['6', '', '10', '9']]}
>>> from pprint import pprint
>>> pprint(_)
{0: [['a', 'b', 'c', 'd']],
 1: [['1', '2', '', '4'], ['6', '', '10', '9']],
 2: [['b', '', '', 'k'], ['6', '', '', '10']],
 3: [['', '', '', 'l']]}

答案 1 :(得分:1)

也许我误会了。

错误:results = [x for x in mylist if '' in x](返回任何元素为''的行)。或者,可以使用results = [(i,r) for i,r in enumerate(mylist) if '' in r](对于这种情况返回索引和行)。

你甚至可以为每个缺少任何列的行获得花哨并返回(index,count,row)的元组:

results = [(i,r.count(''), r) for i,r in enumerate(mylist) if '' in r]

Python中的in运算符适用于大多数容器(元组,列表,集合,字典以及字符串,字节和字节中的子字符串等)。

对于列表,元组,字符串,字节和字节数组,您还可以测试.count(item) > 0

enumerate()是Python中最容易被忽视的内置函数之一。当你想迭代任何集合并同时访问项目索引(行号)时,显然很方便。 for循环(for i,x in enumerate(stuff))的元组解包形式使循环中的代码更清晰,更简洁,更易于阅读。