带有可迭代参数并生成元组的Python:function

时间:2018-07-13 20:30:15

标签: python list tuples

我尝试在python上做某事。

我尝试编写一个带有可迭代参数并生成2个元素的元组的函数:

  1. 当前可迭代元素
  2. 自开始以来已生成的次数

这是我的代码

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: s1
          servicePort: 80
      - path: /bar
        backend:
          serviceName: s2
          servicePort: 80

输出:

liste = ['a','b','a','a','b']

compte = {}.fromkeys(set(liste),0)
for valeur in liste:
     compte[valeur] += 1

print(compte)

但是我想获得{'b': 2, 'a': 3}

感谢帮助

5 个答案:

答案 0 :(得分:3)

您的预期结果是列表,而不是字典。解决您的代码的方法是使用您的字典进行计数,但将其追加到列表中:

>>> liste = ['a','b','a','a','b']
>>>
>>> compte = dict.fromkeys(liste,0) #Or use a default dict
>>> result = []
>>> for valeur in liste:
...  compte[valeur] += 1
...  result.append((valeur,compte[valeur]))
...
>>> print(result)
[('a', 1), ('b', 1), ('a', 2), ('a', 3), ('b', 2)]

答案 1 :(得分:2)

使用生成器函数。

from collections import defaultdict

def with_running_count(values):
    counts = defaultdict(int)
    for value in values:
        counts[value] += 1
        yield value, counts[value]

>>> print(*with_running_count('abaab'))

('a', 1) ('b', 1) ('a', 2) ('a', 3) ('b', 2)

使用生成器而不是其他建议的一个优点是生成器是惰性的。这意味着您可以传递返回无限(或非常大)数据流的迭代器,因为生成器仅在需要时才使用输入流。

# an endless iterator
coin = iter(lambda: random.choice(['heads', 'tails']), None)

# the running count will also be endless        
toss = with_running_count(coin)

>>> next(toss), next(toss), next(toss)
(('tails', 1), ('tails', 2), ('heads', 1))

答案 2 :(得分:2)

您可以通过以下方式修改代码:

liste = ['a','b','a','a','b']

liste2 = []
compte = {}.fromkeys(set(liste),0)
for valeur in liste:
    compte[valeur] += 1
    liste2.append(valeur + ':' + str(compte[valeur]))

print(liste2)

重要的是要说:您要执行的操作不是元组,而是列表,因为它是可变的。您的compte变量是dictionary

答案 3 :(得分:1)

您可以在进行计数时初始化字典:

liste = ['a','b','a','a','b']
compte = {}
result = []
for valeur in liste:
    compte[valeur] = compte.get(valeur, 0) + 1
    result.append((valeur, compte[valeur]))

print(result)

答案 4 :(得分:1)

您可以从Counter模块使用collections

from collections import Counter

liste = ['a','b','a','a','b']

def counter(iterable):
    c = Counter()
    for i in iterable:
        c.update(i)
        yield i, c[i]

print(list(counter(liste)))

输出:

[('a', 1), ('b', 1), ('a', 2), ('a', 3), ('b', 2)]