需要知道python中0后面的个数

问题描述 投票:0回答:3

你知道找到彼此后面的 0 的数量的方法或图书馆吗:

我有一个这样的迪科:

{0: 13518, 1: 5029, 2: 4133, 3: 2304, 4: 1940, 5: 1056, 6: 1317, 7: 779, 8: 862, 9: 735, 10: 776, 11: 537, 12: 633, 13: 521, 14: 737, 15: 606, 16: 676, 17: 533, 18: 567, 19: 439, 20: 494, 21: 321, 22: 305, 23: 176, 24: 170, 25: 93, 26: 86, 27: 63, 28: 54, 29: 25, 30: 34, 31: 17, 32: 17, 33: 16, 34: 16, 35: 16, 36: 10, 37: 4, 38: 6, 39: 7, 40: 14, 41: 5, 42: 5, 43: 1, 44: 1, 45: 2, 46: 0, 47: 1, 48: 2, 49: 3, 50: 3, 51: 5, 52: 14, 53: 31, 54: 6, 55: 94, 56: 21, 57: 72, 58: 11, 59: 17, 60: 24, 61: 3, 62: 0, 63: 1, 64: 2, 65: 1, 66: 1, 67: 0, 68: 1, 69: 0, 70: 3, 71: 0, 72: 1, 73: 0, 74: 0, 75: 0, 76: 0, 77: 1, 78: 0, 79: 0, 80: 1, 81: 0, 82: 1, 83: 0, 84: 1, 85: 1, 86: 2, 87: 7, 88: 1, 89: 0, 90: 1, 91: 5, 92: 1, 93: 3, 94: 1, 95: 1, 96: 0, 97: 0, 98: 0, 99: 0, 100: 3, 101: 0, 102: 0, 103: 0, 104: 0, 105: 0, 106: 0, 107: 0, 108: 0, 109: 0, 110: 0, 111: 0, 112: 0, 113: 0, 114: 0, 115: 0, 116: 0, 117: 0, 118: 0, 119: 0, 120: 0, 121: 0, 122: 0, 123: 0, 124: 0, 125: 0, 126: 0, 127: 0, 128: 0, 129: 0, 130: 0, 131: 0, 132: 0, 133: 0, 134: 0, 135: 0, 136: 0, 137: 0, 138: 0, 139: 0, 140: 0, 141: 0, 142: 0, 143: 0, 144: 0, 145: 0, 146: 0, 147: 0, 148: 0, 149: 0, 150: 0, 151: 0, 152: 0, 153: 0, 154: 0, 155: 0, 156: 0, 157: 0, 158: 0, 159: 0, 160: 0, 161: 0, 162: 0, 163: 0, 164: 0, 165: 0, 166: 0, 167: 0, 168: 0, 169: 0, 170: 0, 171: 0, 172: 0, 173: 0, 174: 0, 175: 0, 176: 0, 177: 0, 178: 0, 179: 0, 180: 0, 181: 0, 182: 0, 183: 0, 184: 0, 185: 0, 186: 0, 187: 0, 188: 0, 189: 0, 190: 0, 191: 0, 192: 0, 193: 0, 194: 0, 195: 0, 196: 0, 197: 0, 198: 0, 199: 0, 200: 0, 201: 0, 202: 0, 203: 0, 204: 0, 205: 0, 206: 0, 207: 0, 208: 0, 209: 0, 210: 1}

我需要找到这个: 1 (46) 1 (62) 1 (67) 1 (69) . . . 4(73 至 76) 2(78 至 79) . . .

实际上我需要一个计数器来计算 0 的数量直到下一个数字并输出值,在 0 重新启动计数器等等。

python counter
3个回答
1
投票

例如,您可以通过简单地迭代相应的键并存储当前运行的零条带的开头来解决它。如果您看到非零值,请重置条带

limit = max(d.keys())
zero_beginning = -1
for i in range(limit):
    if d[i] == 0:
        if zero_beginning == -1:
           zero_beginning = i
    else:
        if zero_beginning != -1:
            print(f'Range from {zero_beginning} to {i-1}, size {i - zero_beginning}')
            zero_beginning = -1

输出:

Range from 46 to 46, size 1
Range from 62 to 62, size 1
Range from 67 to 67, size 1
Range from 69 to 69, size 1
Range from 71 to 71, size 1
Range from 73 to 76, size 4
Range from 78 to 79, size 2
Range from 81 to 81, size 1
Range from 83 to 83, size 1
Range from 89 to 89, size 1
Range from 96 to 99, size 4

0
投票

这是来自某处的编码挑战吗?

你能把说明贴在聊天里让我正确理解吗?


0
投票
>>> import itertools
>>> data = {0: 13518, 1: 5029, 2: 4133, 3: 2304, 4: 1940, 5: 1056, 6: 1317, 7: 779, 8: 862, 9: 735, 10: 776, ...
>>> [(next(it)[0], 1+sum(1 for _ in it)) for val, it in itertools.groupby(data.items(), key=lambda kv: kv[1]) if val == 0]
[(46, 1), (62, 1), (67, 1), (69, 1), (71, 1), (73, 4), (78, 2), (81, 1), (83, 1), (89, 1), (96, 4), (101, 109)]

说明: itertools 中的

groupby
创建等值的子项。我们在字典的项目上运行它并传递一个 lambda 函数作为键,告诉具有相同值的项目应该分组。

>>> list(itertools.groupby(data.items(), key=lambda kv: kv[1]))
[(13518, <itertools._grouper object at 0xffcf0b80>), (5029, <itertools._grouper object at 0xffcf0b38>), (4133, <itertools._grouper object at 0xffcf0b50>), (2304, <itertools._grouper object at 0xffcf0b20>), (1940, <itertools._grouper object at 0xffcf0b68>), (1056, <itertools._grouper object at 0xffcf0b08>),...

如您所见,

groupby
返回元组,第一个元素是我们分组所依据的键(第一项为 13518,...),第二项是可迭代的“石斑鱼”,可以访问元素在群里。

下一步,我们过滤掉

groupby
返回的所有值不为0的项目。

>>> [(val, it) for val, it in itertools.groupby(data.items(), key=lambda kv: kv[1]) if val == 0]
[(0, <itertools._grouper object at 0xffca1490>), (0, <itertools._grouper object at 0xffca1418>), (0, <itertools._grouper object at 0xffca14c0>), (0, <itertools._grouper object at 0xffca14d8>), (0, <itertools._grouper object at 0xffca14f0>), (0, <itertools._grouper object at 0xffca1508>) ...

现在我们要从 groupby 返回的每个“石斑鱼”中提取两件事:第一个元素,我们使用

next
和我们使用
sum
的元素数量。然而,有一个陷阱。
next
调用后,“石斑鱼”的第一项已经被消费,所以我们需要将
sum
的结果加1,才能得到正确的计数。

>>> [(next(it), 1+sum(1 for _ in it)) for val, it in itertools.groupby(data.items(), key=lambda kv: kv[1]) if val == 0]
[((46, 0), 1), ((62, 0), 1), ((67, 0), 1), ((69, 0), 1), ((71, 0), 1), ((73, 0), 4), ((78, 0), 2), ((81, 0), 1), ((83, 0), 1), ((89, 0), 1), ((96, 0), 4), ((101, 0), 109)]

最后一件事只是装饰性的,因为 grouper 中的元素是元组,我们只关心第一个元素(知道第二个元素是零,因为我们过滤了它,我们将我们的术语调整为:

>>> [(next(it)[0], 1+sum(1 for _ in it)) for val, it in itertools.groupby(data.items(), key=lambda kv: kv[1]) if val == 0]
[(46, 1), (62, 1), (67, 1), (69, 1), (71, 1), (73, 4), (78, 2), (81, 1), (83, 1), (89, 1), (96, 4), (101, 109)]
© www.soinside.com 2019 - 2024. All rights reserved.