私信  •  关注

Jab

Jab 最近创建的主题
Jab 最近回复了
2 年前
回复了 Jab 创建的主题 » 将python字典按相等的间隔排序

使用 collections.defaultdict :

from collections import defaultdict

data = {0: 1, 10: 3, 12: 2, 19: 4, 35: 5}
output = defaultdict(list)
for k, v in data.items():
    output[k // 10 * 10].append(v)

>>> dict(out)
{0: [1], 10: [3, 2, 4], 30: [5]}

编辑

如果必须在生成的dict中包含所有键,则用构建键的dict替换默认dict:

out = {k: [] for k in (range(0, (max(data)//10*10)+1, 10))}
for k, v in data.items():
    out[k // 10 * 10].append(v)
2 年前
回复了 Jab 创建的主题 » python:元组列表搜索

你可以用 next 与用户的方法类似:

num = [(1,4,5,30,33,41,52),(2,10,11,29,30,36,47),(3,15,25,37,38,58,59)]
to_find = [10,11,29,30,36,47]

print(next(n for n, *nums in num if nums == to_find))

2

collections.Counter 而不是 collections.OrderedDict :

from collections import Counter

members = {
    "member1" : ["PCP2", "PCP3"],
    "member2" : ["PCP1", "PCP2"],
    "member3" : ["PCP3"],
    "member4" : ["PCP1"],
    "member5" : ["PCP4", "PCP5"],
    "member6" : ["PCP1", "PCP5"],
    "member7" : ["PCP2", "PCP3", "PCP4"],
    "member8" : ["PCP3", "PCP5"],
    "member9" : ["PCP1", "PCP4", "PCP5"],
    "member10" : ["PCP2", "PCP4"],
    "member11" : ["PCP2"],
    "member12" : ["PCP3"],
    "member13" : ["PCP4", "PCP5"]}
providers = Counter({
    "PCP1" : 3,
    "PCP2" : 4,
    "PCP3" : 2,
    "PCP4" : 3,
    "PCP5" : 4,
})

PCPcounts = Counter()

for m in members.values():
    PCPcounts.update(m)

differences = PCPcounts - providers

差异打印:

Counter({'PCP3': 3, 'PCP4': 2, 'PCP2': 1, 'PCP1': 1, 'PCP5': 1})

itertools.chain

from itertools import chain
PCPcounts = Counter(chain(*members.values()))

而不是for循环。

使用 wait_for

async def botcalc(self, ctx):
        author = ctx.author
        numbers = []

        def check(m):
            return m.author ==  author

        for _ in ('first', 'second'):
            await ctx.send(f"enter {_} number")
            num = ""
            while not num.isdigit():
                num = await client.wait_for('message', check=check)
            numbers.append[int(num)]

        await channel.send(f'{numbers[0]}+{numbers[1]}={sum{numbers)}')

编辑

添加支票

4 年前
回复了 Jab 创建的主题 » 在字符串Python中查找数组的平均长度

已经有一个函数在 statistics 能做到这一点的图书馆 len 所以你要提供它的长度。

l = ['fee','freed','free']
statistics.mean(map(len, l))
4 年前
回复了 Jab 创建的主题 » python使数组变平,为什么funtools比较慢?

这与 list comprehension vs map 当你使用 lambda 和你的 reduce 语句发送python代码以在每次迭代中运行,从而减慢reduce的速度。列表理解的目的是更有效和可读性,因此它们是首选的方法。

那就是为什么不用 itertools.chain.from_iterable 以及 map 发出砰的声响 operator.itemgetter 是的。这会产生相同的输出,同时也会利用一些很好的内置方法。 没有测试速度

>>> from itertools import chain
>>> from operator import itemgetter
>>> arr = array([[array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668],
      dtype='int64')],
       [array([33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665],
      dtype='int64')],
       [array([46842, 26434, 39758, 27761, 10054, 21351, 22598, 34862, 40285,
       17616, 25146, 32645, 41276], dtype='int64')],
       [array([24534,  8230, 14267,  9352,  3543, 29397,   900, 32398, 34262,
       37646, 11930, 37173], dtype='int64')],
       [array([25157], dtype='int64')],
       [array([ 8859, 20850, 19322,  8075], dtype='int64')]], dtype=object)
>>> array(list(chain.from_iterable(map(itemgetter(0),arr.tolist()))))
[33120 28985  9327 45918 30035 17794 40141  1819 43668 33754 24838 17704
 21903 17668 46667 17461 32665 46842 26434 39758 27761 10054 21351 22598
 34862 40285 17616 25146 32645 41276 24534  8230 14267  9352  3543 29397
 900 32398 34262 37646 11930 37173 25157  8859 20850 19322  8075]