从两个列表中的项目创建一个集合

时间:2014-12-16 11:30:37

标签: python list set

我有以下代码:

ids = set()
for result in text_results:
    ids.add(str(result[5]))
for result in doc_results:
    ids.add(str(result[4]))

text_resultsdoc_results都是包含其他列表的列表,您可能已经猜到了这些列表。是否有更有效的方法使用漂亮的oneliner而不是两个for循环来做到这一点?

5 个答案:

答案 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']