【问题标题】:Find same elements in a list, and then change these elemens to tuple (f.e. 2 to (2,1))在列表中找到相同的元素,然后将这些元素更改为元组(f.e. 2 to (2,1))
【发布时间】:2015-12-07 16:59:55
【问题描述】:

在列表中找到相同的元素,然后将这些元素更改为元组(f.e. 2 to (2, 1)),为重复的元素添加计数。

所以我有这个清单:

a = [1, 2, 4, 3, 2, 1]

我想得到:

a = [(1, 1), (2, 1), 4, 3, (2, 2), (1, 2)]

其中第二个元素是一个计数器(从 1 开始),因此第二个 1 数字被替换为 (1, 2)。第三个会变成(1, 3)

【问题讨论】:

  • 欢迎来到 Stack Overflow!看起来您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只会在发布者已经尝试自己解决问题时提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、堆栈跟踪、编译器错误 - 不管是什么适用的)。您提供的详细信息越多,您可能收到的答案就越多。
  • 此外,我不太清楚输入列表如何导致给定的输出。为什么是(2, 1)(1, 2),例如?
  • 元组中的第二个值是否可能是一个计数器,从 1 开始?为什么不同时添加这样的计数 43,即使它们只会上升到 1
  • 谢谢!想法我想将列表中的相同元素替换为元组,因为在我想将它与其他列表压缩到 dict 之后,并且你知道 Python 不支持 dict 中的相同键,所以我试图让它像这样。 1 -> (1,1) 如果它的第一个 1
  • 是的,我了解到4 不再重复。但是现在您正在创建不一致的键。您稍后会为您的代码提供更多工作,以尝试确定键是元组还是整数。你会更容易做到一致

标签: python list python-3.x


【解决方案1】:

要添加计数,您可以在 defaultdict 中保留一组 itertools.count objects

from itertools import count
from collections import defaultdict

counters = defaultdict(lambda: count(1))

result = [(n, next(counters[n])) for n in inputlist]

但这会增加列表中所有元素的计数:

>>> from itertools import count
>>> from collections import defaultdict
>>> counters = defaultdict(lambda: count(1))
>>> inputlist = [1, 2, 4, 3, 2, 1]
>>> [(n, next(counters[n])) for n in inputlist]
[(1, 1), (2, 1), (4, 1), (3, 1), (2, 2), (1, 2)]

这使您的输出保持一致,并避免以后必须测试这些元素之一是整数还是元组。

如果您必须仅为重复元素生成元组,则必须执行两个步骤;使用collections.Counter() 创建一个计数,然后使用与上述相同的计数技巧,但仅适用于总计数大于 1 的元素:

from itertools import count
from collections import defaultdict, Counter

counters = defaultdict(lambda: count(1))
tally = Counter(inputlist)

result = [(n, next(counters[n])) if tally[n] > 1 else n for n in inputlist]

演示:

>>> from collections import Counter
>>> counters = defaultdict(lambda: count(1))
>>> tally = Counter(inputlist)
>>> [(n, next(counters[n])) if tally[n] > 1 else n for n in inputlist]
[(1, 1), (2, 1), 4, 3, (2, 2), (1, 2)]

但是,如果您尝试为字典生成“唯一”键,请考虑将 分组,而不是:

{(1, 1): foo, (1, 2): bar}

产生列表或集合:

{1: [foo, bar]}
{1: {foo, bar}}

您也可以使用defaultdict 这样做:

result = defaultdict(set)
for key, value in zip(keys, values):
    result[key].add(value)

为每个键生成一个集合,或使用defauldict(list)result[key].append(value) 生成一个列表。

【讨论】:

  • 对字典的最后部分没看懂,你有什么建议?
  • @VadimBorisov:添加了一条建议。
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多