Подсчет групп словарных ключей с использованием заполнителя - PullRequest
1 голос
/ 30 марта 2020

Словарь состоит из строк-столбцов-ключей. Некоторые строки имеют только один столбец (r1c1), в то время как другие имеют больше (r5c1, r5c2, r5c3 ...). Я хотел бы посчитать ключи (и так столбцы) каждой строки.

row_dic = {'r1c1': (680, 155, 591, 12), 'r2c1': (679, 195, 592, 12), 'r3c1': (682, 241, 587, 11), 'r3c2': (1542, 252, 179, 30), 'r4c1': (1541, 289, 180, 49), 'r5c1': (455, 344, 226, 18), 'r5c2': (688, 345, 573, 17), 'r5c3': (1268, 345, 265, 18), 'r5c4': (1541, 345, 180, 18), 'r6c1': (454, 370, 227, 17), 'r6c2': (688, 370, 573, 18), 'r6c3': (1268, 370, 264, 18), 'r6c4': (1541, 371, 180, 17), 'r7c1': (454, 395, 227, 18), 'r7c2': (688, 395, 573, 18), 'r7c3': (1268, 396, 264, 17), 'r7c4': (1541, 396, 180, 17), 'r8c1': (454, 420, 227, 68), 'r8c2': (687, 421, 574, 67), 'r8c3': (1268, 421, 264, 67), 'r8c4': (1541, 422, 179, 67), 'r9c1': (454, 495, 226, 43), 'r9c2': (687, 496, 574, 43), 'r9c3': (1268, 496, 264, 43), 'r9c4': (1540, 497, 180, 42), 'r10c1': (453, 546, 227, 42), 'r10c2': (687, 546, 574, 43), 'r10c3': (1268, 546, 263, 43), 'r10c4': (1540, 547, 180, 42), 'r11c1': (453, 596, 227, 42), 'r11c2': (687, 596, 574, 43), 'r11c3': (1267, 597, 264, 42), 'r11c4': (1540, 597, 180, 42), 'r12c1': (453, 646, 227, 18), 'r12c2': (687, 647, 573, 17), 'r12c3': (1267, 647, 264, 18), 'r12c4': (1540, 647, 179, 18), 'r13c1': (453, 672, 227, 17), 'r13c2': (686, 672, 574, 17), 'r13c3': (1267, 672, 264, 18), 'r13c4': (1540, 673, 179, 17), 'r14c1': (453, 697, 227, 17), 'r14c2': (686, 697, 574, 18), 'r14c3': (1267, 697, 264, 18), 'r14c4': (1540, 698, 179, 17), 'r15c1': (453, 722, 227, 42), 'r15c2': (686, 722, 574, 43), 'r15c3': (1267, 723, 264, 42), 'r15c4': (1540, 723, 179, 42), 'r16c1': (453, 772, 227, 17), 'r16c2': (686, 772, 574, 18), 'r16c3': (1267, 773, 264, 17), 'r16c4': (1540, 773, 179, 17), 'r17c1': (453, 797, 227, 68), 'r17c2': (686, 797, 574, 69), 'r17c3': (1267, 798, 264, 68), 'r17c4': (1540, 798, 179, 68), 'r18c1': (453, 873, 226, 17), 'r18c2': (686, 873, 574, 17), 'r18c3': (1267, 874, 263, 17), 'r18c4': (1540, 874, 179, 17), 'r19c1': (453, 898, 226, 18), 'r19c2': (686, 898, 574, 18), 'r19c3': (1267, 899, 263, 17), 'r19c4': (1540, 899, 179, 17), 'r20c1': (453, 923, 226, 18), 'r20c2': (686, 924, 574, 17), 'r20c3': (1267, 924, 263, 18), 'r20c4': (1540, 925, 179, 17), 'r21c1': (452, 949, 227, 67), 'r21c2': (686, 949, 574, 68), 'r21c3': (1267, 949, 263, 68), 'r21c4': (1539, 950, 180, 67), 'r22c1': (452, 1024, 227, 93), 'r22c2': (685, 1025, 574, 92), 'r22c3': (1266, 1025, 264, 92), 'r22c4': (1539, 1025, 179, 92), 'r23c1': (452, 1124, 227, 43), 'r23c2': (685, 1125, 574, 42), 'r23c3': (1266, 1125, 264, 43), 'r23c4': (1539, 1125, 179, 43), 'r24c1': (452, 1175, 227, 17), 'r24c2': (685, 1175, 574, 18), 'r24c3': (1266, 1175, 264, 18), 'r24c4': (1539, 1176, 179, 17), 'r25c1': (452, 1200, 227, 18), 'r25c2': (685, 1200, 574, 18), 'r25c3': (1266, 1201, 263, 17), 'r25c4': (1539, 1201, 179, 17), 'r26c1': (452, 1225, 226, 18), 'r26c2': (685, 1226, 574, 17), 'r26c3': (1266, 1226, 263, 18), 'r26c4': (1539, 1226, 179, 18), 'r27c1': (452, 1251, 226, 17), 'r27c2': (685, 1251, 574, 18), 'r27c3': (1266, 1251, 263, 18), 'r27c4': (1539, 1252, 179, 17), 'r28c1': (452, 1276, 226, 18), 'r28c2': (685, 1276, 574, 18), 'r28c3': (1266, 1277, 263, 17), 'r28c4': (1538, 1277, 180, 17), 'r29c1': (452, 1301, 226, 18), 'r29c2': (685, 1301, 574, 18), 'r29c3': (1266, 1302, 263, 17), 'r29c4': (1538, 1302, 180, 17), 'r30c1': (452, 1326, 226, 18), 'r30c2': (685, 1327, 574, 18), 'r30c3': (1266, 1327, 263, 18), 'r30c4': (1538, 1328, 180, 17), 'r31c1': (452, 1352, 226, 42), 'r31c2': (685, 1352, 574, 43), 'r31c3': (1266, 1352, 263, 43), 'r31c4': (1538, 1353, 180, 42), 'r32c1': (452, 1402, 226, 43), 'r32c2': (685, 1402, 574, 43), 'r32c3': (1265, 1403, 264, 42), 'r32c4': (1538, 1403, 180, 42), 'r33c1': (452, 1452, 226, 18), 'r33c2': (685, 1453, 574, 17), 'r33c3': (1265, 1453, 264, 18), 'r33c4': (1538, 1453, 179, 18), 'r34c1': (452, 1478, 226, 18), 'r34c2': (685, 1478, 574, 18), 'r34c3': (1266, 1478, 263, 18), 'r34c4': (1538, 1478, 179, 18), 'r35c1': (452, 1503, 226, 17), 'r35c2': (685, 1503, 574, 17), 'r35c3': (1266, 1503, 263, 18), 'r35c4': (1538, 1504, 179, 17), 'r36c1': (452, 1528, 226, 52), 'r36c2': (685, 1528, 574, 52), 'r36c3': (1266, 1529, 263, 50), 'r36c4': (1538, 1529, 179, 50), 'r37c1': (1267, 1589, 263, 49), 'r37c2': (1537, 1589, 181, 49), 'r38c1': (1267, 1648, 263, 50), 'r38c2': (1537, 1648, 181, 50), 'r39c1': (1267, 1707, 263, 49), 'r39c2': (1357, 1726, 99, 9), 'r39c3': (1537, 1707, 181, 49), 'r40c1': (1299, 1786, 121, 14)}

Я думал об использовании заполнителя для значения, но я не нашел адекватного решения для категоризации значений в r1, r2, r3. Я попробовал следующее, которое не сработало.

for key, value in row_dic.items():
    if 'r%dc' in key:
        counted = Counter(key[:2]).most_common(6)

// counted = Counter(key[:2] for key, value in row_dic.items() if ("r%dc") in key).most_common(9)

Вывод было бы хорошо, чтобы быть что-то вроде:

counted = {r1c: 1, r2c: 1, ..., r5c: 4, ...}
# or
list = [[1], [1], ..., [4], ...]

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Предполагается, что все исходные ключи имеют форму r<num>c<num>, но при условии, что это так, вы можете сделать

counted = dict()
for r in row_dic.keys():
    rownum = r.split("c")[0]
    try:
        counted[rownum] +=1
    except KeyError:
        counted[rownum] = 1

Тогда counted будет {"r1":1,"r2":1... etc...}.

Если вы хотите, чтобы ключи были в указанной вами форме r1c, я думаю, просто добавьте 'c' обратно в ключ, прежде чем добавить его к counted

rowcount[rownum + 'c']

1 голос
/ 30 марта 2020

A может сначала перебрать ключи, разделить ключ на 'c', а затем посчитать его с включенным обратно 'c'.

from collections import Counter

row_dic = {'r1c1': (680, 155, 591, 12), 'r2c1': (679, 195, 592, 12), 'r3c1': (682, 241, 587, 11), 'r3c2': (1542, 252, 179, 30), 'r4c1': (1541, 289, 180, 49), 'r5c1': (455, 344, 226, 18), 'r5c2': (688, 345, 573, 17), 'r5c3': (1268, 345, 265, 18), 'r5c4': (1541, 345, 180, 18), 'r6c1': (454, 370, 227, 17), 'r6c2': (688, 370, 573, 18), 'r6c3': (1268, 370, 264, 18), 'r6c4': (1541, 371, 180, 17), 'r7c1': (454, 395, 227, 18), 'r7c2': (688, 395, 573, 18), 'r7c3': (1268, 396, 264, 17), 'r7c4': (1541, 396, 180, 17), 'r8c1': (454, 420, 227, 68), 'r8c2': (687, 421, 574, 67), 'r8c3': (1268, 421, 264, 67), 'r8c4': (1541, 422, 179, 67), 'r9c1': (454, 495, 226, 43), 'r9c2': (687, 496, 574, 43), 'r9c3': (1268, 496, 264, 43), 'r9c4': (1540, 497, 180, 42), 'r10c1': (453, 546, 227, 42), 'r10c2': (687, 546, 574, 43), 'r10c3': (1268, 546, 263, 43), 'r10c4': (1540, 547, 180, 42), 'r11c1': (453, 596, 227, 42), 'r11c2': (687, 596, 574, 43), 'r11c3': (1267, 597, 264, 42), 'r11c4': (1540, 597, 180, 42), 'r12c1': (453, 646, 227, 18), 'r12c2': (687, 647, 573, 17), 'r12c3': (1267, 647, 264, 18), 'r12c4': (1540, 647, 179, 18), 'r13c1': (453, 672, 227, 17), 'r13c2': (686, 672, 574, 17), 'r13c3': (1267, 672, 264, 18), 'r13c4': (1540, 673, 179, 17), 'r14c1': (453, 697, 227, 17), 'r14c2': (686, 697, 574, 18), 'r14c3': (1267, 697, 264, 18), 'r14c4': (1540, 698, 179, 17), 'r15c1': (453, 722, 227, 42), 'r15c2': (686, 722, 574, 43), 'r15c3': (1267, 723, 264, 42), 'r15c4': (1540, 723, 179, 42), 'r16c1': (453, 772, 227, 17), 'r16c2': (686, 772, 574, 18), 'r16c3': (1267, 773, 264, 17), 'r16c4': (1540, 773, 179, 17), 'r17c1': (453, 797, 227, 68), 'r17c2': (686, 797, 574, 69), 'r17c3': (1267, 798, 264, 68), 'r17c4': (1540, 798, 179, 68), 'r18c1': (453, 873, 226, 17), 'r18c2': (686, 873, 574, 17), 'r18c3': (1267, 874, 263, 17), 'r18c4': (1540, 874, 179, 17), 'r19c1': (453, 898, 226, 18), 'r19c2': (686, 898, 574, 18), 'r19c3': (1267, 899, 263, 17), 'r19c4': (1540, 899, 179, 17), 'r20c1': (453, 923, 226, 18), 'r20c2': (686, 924, 574, 17), 'r20c3': (1267, 924, 263, 18), 'r20c4': (1540, 925, 179, 17), 'r21c1': (452, 949, 227, 67), 'r21c2': (686, 949, 574, 68), 'r21c3': (1267, 949, 263, 68), 'r21c4': (1539, 950, 180, 67), 'r22c1': (452, 1024, 227, 93), 'r22c2': (685, 1025, 574, 92), 'r22c3': (1266, 1025, 264, 92), 'r22c4': (1539, 1025, 179, 92), 'r23c1': (452, 1124, 227, 43), 'r23c2': (685, 1125, 574, 42), 'r23c3': (1266, 1125, 264, 43), 'r23c4': (1539, 1125, 179, 43), 'r24c1': (452, 1175, 227, 17), 'r24c2': (685, 1175, 574, 18), 'r24c3': (1266, 1175, 264, 18), 'r24c4': (1539, 1176, 179, 17), 'r25c1': (452, 1200, 227, 18), 'r25c2': (685, 1200, 574, 18), 'r25c3': (1266, 1201, 263, 17), 'r25c4': (1539, 1201, 179, 17), 'r26c1': (452, 1225, 226, 18), 'r26c2': (685, 1226, 574, 17), 'r26c3': (1266, 1226, 263, 18), 'r26c4': (1539, 1226, 179, 18), 'r27c1': (452, 1251, 226, 17), 'r27c2': (685, 1251, 574, 18), 'r27c3': (1266, 1251, 263, 18), 'r27c4': (1539, 1252, 179, 17), 'r28c1': (452, 1276, 226, 18), 'r28c2': (685, 1276, 574, 18), 'r28c3': (1266, 1277, 263, 17), 'r28c4': (1538, 1277, 180, 17), 'r29c1': (452, 1301, 226, 18), 'r29c2': (685, 1301, 574, 18), 'r29c3': (1266, 1302, 263, 17), 'r29c4': (1538, 1302, 180, 17), 'r30c1': (452, 1326, 226, 18), 'r30c2': (685, 1327, 574, 18), 'r30c3': (1266, 1327, 263, 18), 'r30c4': (1538, 1328, 180, 17), 'r31c1': (452, 1352, 226, 42), 'r31c2': (685, 1352, 574, 43), 'r31c3': (1266, 1352, 263, 43), 'r31c4': (1538, 1353, 180, 42), 'r32c1': (452, 1402, 226, 43), 'r32c2': (685, 1402, 574, 43), 'r32c3': (1265, 1403, 264, 42), 'r32c4': (1538, 1403, 180, 42), 'r33c1': (452, 1452, 226, 18), 'r33c2': (685, 1453, 574, 17), 'r33c3': (1265, 1453, 264, 18), 'r33c4': (1538, 1453, 179, 18), 'r34c1': (452, 1478, 226, 18), 'r34c2': (685, 1478, 574, 18), 'r34c3': (1266, 1478, 263, 18), 'r34c4': (1538, 1478, 179, 18), 'r35c1': (452, 1503, 226, 17), 'r35c2': (685, 1503, 574, 17), 'r35c3': (1266, 1503, 263, 18), 'r35c4': (1538, 1504, 179, 17), 'r36c1': (452, 1528, 226, 52), 'r36c2': (685, 1528, 574, 52), 'r36c3': (1266, 1529, 263, 50), 'r36c4': (1538, 1529, 179, 50), 'r37c1': (1267, 1589, 263, 49), 'r37c2': (1537, 1589, 181, 49), 'r38c1': (1267, 1648, 263, 50), 'r38c2': (1537, 1648, 181, 50), 'r39c1': (1267, 1707, 263, 49), 'r39c2': (1357, 1726, 99, 9), 'r39c3': (1537, 1707, 181, 49), 'r40c1': (1299, 1786, 121, 14)}

counts = Counter()
for row_col in row_dic:
    row, _ = row_col.split("c")
    counts[row + 'c'] += 1

print(counts)

Или как однострочник:

Counter(row_col.split("c")[0] + 'c' for row_col in row_dic)

Вывод:

Counter({'r5c': 4, 'r6c': 4, 'r7c': 4, 'r8c': 4, 'r9c': 4, 'r10c': 4, 'r11c': 4, 'r12c': 4, 'r13c': 4, 'r14c': 4, 'r15c': 4, 'r16c': 4, 'r17c': 4, 'r18c': 4, 'r19c': 4, 'r20c': 4, 'r21c': 4, 'r22c': 4, 'r23c': 4, 'r24c': 4, 'r25c': 4, 'r26c': 4, 'r27c': 4, 'r28c': 4, 'r29c': 4, 'r30c': 4, 'r31c': 4, 'r32c': 4, 'r33c': 4, 'r34c': 4, 'r35c': 4, 'r36c': 4, 'r39c': 3, 'r3c': 2, 'r37c': 2, 'r38c': 2, 'r1c': 1, 'r2c': 1, 'r4c': 1, 'r40c': 1})

Примечание: Counter является подклассом dict, поэтому результат по-прежнему является словарем. Если вы хотите, чтобы результат был dict, то вы можете разыграть dict:

print(dict(counts))
# {'r1c': 1, 'r2c': 1, 'r3c': 2, 'r4c': 1, 'r5c': 4, 'r6c': 4, 'r7c': 4, 'r8c': 4, 'r9c': 4, 'r10c': 4, 'r11c': 4, 'r12c': 4, 'r13c': 4, 'r14c': 4, 'r15c': 4, 'r16c': 4, 'r17c': 4, 'r18c': 4, 'r19c': 4, 'r20c': 4, 'r21c': 4, 'r22c': 4, 'r23c': 4, 'r24c': 4, 'r25c': 4, 'r26c': 4, 'r27c': 4, 'r28c': 4, 'r29c': 4, 'r30c': 4, 'r31c': 4, 'r32c': 4, 'r33c': 4, 'r34c': 4, 'r35c': 4, 'r36c': 4, 'r37c': 2, 'r38c': 2, 'r39c': 3, 'r40c': 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...