【问题标题】:select top 3 unique items in a list of list在列表列表中选择前 3 个唯一项目
【发布时间】:2020-09-23 04:17:48
【问题描述】:

我有一个项目列表,它会输出一个列表列表:

item_list = ['book', 'pen']
output = [
    ['pencil', 'eraser', 'pen', 'glue', 'folders'], 
    ['notepad', 'book','pencil', 'markers','ruler','scissors']
]

有没有办法将输出作为唯一的项目列表,其中包含每个子列表中的前 3 个项目,但也不在初始 item_list 中?

所以输出看起来像(按照确切的顺序):

new_output = ['pencil', 'eraser', 'glue', 'notepad', 'markers', 'ruler']

或者如果可能的话:

new_output = ['pencil', 'notepad', 'eraser', 'markers', 'glue','ruler']

【问题讨论】:

  • 你如何决定哪个项目是顶级的?
  • 它最初是一个包含 item 和 value 列的数据框,但我对其进行了排序,只取了 item 列并将其作为列表。
  • 我不是问你从哪里得到这个列表,我问的是你如何找到前 3 个项目?
  • 当您说“前 3 项”时,是什么意思?例如,什么规则告诉您'pencil''eraser''glue' 是第一个列表中的“前 3 项”,而'folders' 不是其中之一?
  • 另外:如果给定的输入列表中没有 3 个可用项目,你应该怎么做?

标签: python python-3.x list nested-lists


【解决方案1】:

您必须保留已查看项目的set 才能找到唯一的项目。一个简单的实现是:

item_list = ['book', 'pen']
output = [['pencil', 'eraser', 'pen', 'glue', 'folders'],
          ['notepad', 'book', 'pencil', 'markers', 'ruler', 'scissors']]

already_seen = set(item_list)
new_output = []
for sublist in output:
  new_sublist = [item for item in sublist if item not in already_seen]
  new_output.extend(new_sublist[:3])
  already_seen |= set(new_sublist[:3])

print(new_output)

输出:

['pencil', 'eraser', 'glue', 'notepad', 'markers', 'ruler']

【讨论】:

  • already_seen |= set(new_sublist) 在两组之间做什么?
  • 如果你把推导式变成一个生成器并在上面调用next 三次(例如使用itertools.isloce),你就可以避免将整行变成一个列表的需要。不那么漂亮,但更高效。
  • @fardinho21。添加到集合中。逻辑或是联合操作。
  • @MadPhysicist 好主意,但我会留下答案,因为它不会进一步复杂化。
  • @Selcuk 非常感谢您的快速回答!它真的帮了我很多!再次为含糊不清和奇怪的措辞感到抱歉:)
猜你喜欢
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2015-02-08
相关资源
最近更新 更多