itertools/groupby/for循环

mepcadol  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(397)

我最近一直在寻找一种更好的方法来检查 group 是否已处理。所需的代码行如下所示( if (key == group[0][0]): ). 我试图实现的想法如下:
必须在循环的每一轮中对其进行检查 for group in groups ,如果满足上述条件。因此,在第一组中的所有项目都已打印之后,for循环将跳转到下一组并执行相同的操作(在检查第二个条件之后) if (key == item[0]): ). 因此,要点是防止for循环跳转到下一组,因为每个项的键和第一个元素之间不匹配,这意味着;在那里找不到或打印任何元素。话虽如此,我还是尽量避免跳入其他有另一把钥匙的小组,这样可以节省时间和内存。
所以问题是,;如果有更好的方法来实现这个想法,因为我自己的措辞条件有点原始(检查第一个单词是否与关键单词相同)。
非常感谢!

  1. things = [("animal", "lion"), ("object", "computer"), ("animal", "giraffe"), ("animal","tiger"),("object","table"),("clothes", "jacket"), ("animal", "dog")]
  2. sorted_things = sorted(things)
  3. groups = []
  4. special_keys = []
  5. for key, group in groupby(sorted_things, lambda x: x[0]):
  6. groups.append(list(group))
  7. special_keys.append(key)
  8. counting = 0
  9. for key in special_keys:
  10. print("These things are to this key " + key + " sorted: ")
  11. for group in groups:
  12. if (key == group[0][0]):
  13. for item in group:
  14. if (key == item[0]):
  15. print(" ",item[1])

以下是输出:

  1. These things are to this key animal sorted:
  2. dog
  3. giraffe
  4. lion
  5. tiger
  6. These things are to this key clothes sorted:
  7. jacket
  8. These things are to this key object sorted:
  9. computer
  10. table
i7uaboj4

i7uaboj41#

所以问题是,;如果有更好的方法来实现这个想法
以下是我将如何获得相同的输出:

  1. from itertools import groupby
  2. from operator import itemgetter
  3. sorted_things = [
  4. ('animal', 'dog'),
  5. ('animal', 'giraffe'),
  6. ('animal', 'lion'),
  7. ('animal', 'tiger'),
  8. ('clothes', 'jacket'),
  9. ('object', 'computer'),
  10. ('object', 'table'),
  11. ]
  12. for key, values in groupby(sorted_things, key=itemgetter(0)):
  13. print(f'These things are to this key {key} sorted:')
  14. for key, value in values:
  15. print(' ' * 42, value)

请注意,groupby()函数已经具有这样的逻辑:“在第一个组中的所有项目都已打印完毕后,for循环将跳转到下一个组。”
无需检查第一个元素以匹配键。groupby()函数已经为您完成了这项工作。

展开查看全部

相关问题