【问题标题】:Tuple of Pairs from List of Integers整数列表中的对元组
【发布时间】:2020-07-11 01:34:41
【问题描述】:

我正在尝试从整数列表创建元组对列表。元组对列表将包含在列表中找到的数字对。示例如下:

listofint = [4, 3, 1, 2, 3, 1, 1, 3, 5, 1, 2, 2]
listoftuplepairs = [(3,3),(1,1),(2,2),(1,1)]

我很困惑如何使用列表理解来实现这一点。我在下面尝试过,但它只返回一个空字符串。

listoftuplepairs = [(i,listofint.remove(i)) for i in listofint if listofint.remove(i) == i]

我了解在列表中使用 remove() 不会返回任何内容。我已经尝试过pop(),但我只能将列表索引作为参数传递给它,而不是我想要pop() 并存储在我的元组列表中的实际值。

还有其他方法可以通过列表理解来做到这一点吗?

【问题讨论】:

  • 如果listofint = [4, 3,1,3,3, 1, 2, 3, 1]会输出什么?
  • listoftuplepairs = [(3,3),(1,1),(3,3)]。它找到哪个数字有一对并从中创建一个元组,然后将其添加到listoftuplepairs
  • 输出顺序重要吗?
  • 并非如此。但我假设如果我要遍历每个元素,那将是顺序。所以我会删除第一个元素,在列表中找到它的对,将它添加到元组中,从列表中删除它。然后重新开始

标签: python python-3.x list tuples list-comprehension


【解决方案1】:

你可以用Counter试试这个

Counter用于统计hashable对象的出现次数。

from collections import Counter
l=[4, 3, 1, 2, 3, 1, 1, 3, 5, 1, 2, 2]
c=Counter(l)
# Counter({4: 1, 3: 3, 1: 4, 2: 3, 5: 1})

[(k,k) for k,v in c.items() for _ in range(v//2)]
# [(3, 3), (1, 1), (1, 1), (2, 2)]

因此,这里的键 k 将是数字,而值 v 将是它在列表中出现的次数。既然你想让对得到我做的对数v//2。 单行列表理解中的上述方法是

[(k,k) for k,v in Counter(l).items() for _ in range(v//2)]

使用dict.fromkeys。只是模仿Counter 在这里所做的。

c=dict.fromkeys(l,0)
for k in l:
    c[k]+=1

[(k,k) for k,v in c.items() for _ in range(v//2)]

【讨论】:

  • 您能解释一下 Counter 的作用以及这段代码的作用吗?我是列表推导的新手。
  • @Nico_Robin Counter 是用于计算可散列对象的 dict 子类。我会在答案中添加解释。 ;)
  • @Nico_Robin 添加了解释。希望它有所帮助。 ;) 如果您有任何疑问,请随时询问。
  • 感谢更详尽的解释! :) 但是,我仍然不明白range(v//2) 的目的
  • @Nico_Robin 我正在为每个 k,v 创建 v//2 对 (k,k)。
猜你喜欢
  • 2021-11-23
  • 2019-06-19
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2022-01-08
相关资源
最近更新 更多