下午。我目前正在尝试使用列表推导来返回没有完整信息的列表行。我的列表是从字符串值排列的,类似于:
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子集然后使用列表理解。谢谢!
答案 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)
)的元组解包形式使循环中的代码更清晰,更简洁,更易于阅读。