我有以下代码:
ids = set()
for result in text_results:
ids.add(str(result[5]))
for result in doc_results:
ids.add(str(result[4]))
text_results
和doc_results
都是包含其他列表的列表,您可能已经猜到了这些列表。是否有更有效的方法使用漂亮的oneliner而不是两个for循环来做到这一点?
答案 0 :(得分:4)
我可能会写:
ids = set(str(result[5]) for result in text_results)
ids.update(str(result[4]) for result in doc_results)
至于效率,如果你想要挤出所有可能的性能,那么你首先需要一个真实的数据集,然后你可以尝试像map
(或Python 2中的itertools.imap
)和{{ 1}},看看会更快。
如果你绝对必须有一个单行:
operator.itemgetter
虽然,如果你想要一个单行,它也值得优化以简洁,以便你的单行可读,然后看看性能是否足够:
ids = set(itertools.chain((str(result[5]) for result in text_results), (str(result[4]) for result in doc_results)))
这"感觉"效率低下因为它连接了两个列表,这些列表不是必需的。但这并不意味着它对您的数据来说效率很低,因此它的价值包括在您的测试中。
答案 1 :(得分:0)
这一个班轮应该有效:
ids = set(map (lambda x: str(x[4]), doc_results) + map(lambda x: str(x[5]), text_results))
答案 2 :(得分:0)
这个(包裹的)一个衬垫应该可以工作:
ids = set([str(tr[5]) for tr in text_results] +
[str(dr[4]) for dr in doc_results])
答案 3 :(得分:0)
这样做:
ids = {str(i) for text, doc in zip(text_results, doc_results) for i in (text[5], doc[4])}
这假设结果如下:
text_results = [['t11', 't12', 't13', 't14', 't15', 't16'], ['t21', 't22', 't23', 't24', 't25', 't26']]
doc_results = [['d11', 'd12', 'd13', 'd14', 'd15', 'd16'], ['d21', 'd22', 'd23', 'd24', 'd25', 'd26']]
你想要:
ids = {'d15', 't26', 't16', 'd25'}
答案 4 :(得分:0)
我想这是一种更加pythonic的方式:
map(str,set([i[5] for i in text_results]+[i[4] for i in doc_results]))
演示:
>>> text_results = [[1,2,3,4,5,6,7,8,9],[1,2,3,4,56,6],[4,5,6,1,2,6,22],[1,2,3,4,5,7,8,9]]
>>> doc_results = [[1,2,3,4,5,9,7,8,9],[1,2,3,4,56,3],[4,5,6,1,2,7,22],[1,2,3,4,5,7,7,9]]
>>> map(str,set([i[5] for i in text_results]+[i[4] for i in doc_results]))
['56', '2', '5', '6', '7']