Seite 1 von 1

Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 15:19
von Kalysto
Hallo zusammen,

Ich habe mir folgendes geschrieben:

Code: Alles auswählen

manufacturerAreas = [1,2,3,4,5,6,10,11,12,13,14,15]
def fill_gaps(self, sorted_iterable):
	flatten = chain.from_iterable
	return flatten(range(i + 1, j) for i, j in self.find_gaps(sorted_iterable))
	
print(list(self.fill_gaps(manufacturerAreas)))
	
was mir dann folgende ausgaben geben wird:

Code: Alles auswählen

[7,8,9]
nun wollte ich versuchen da meine Bereiche größer sind und dann x zahlen auftauchen würden abzukürzen.... in z.b.: aber natürlich auch nur wenn die Zahlenfolge durchgängig ist....
wisst ihr ob sowas machbar ist ;) ??

danke schonmal für eure Hilfe!

Mit freundlichen Grüßen
Kalysto

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 15:33
von nezzcarth
Das ist relativ einfach möglich. Beispielsweise mit Mengen. Hier mal ein paar Beispiele:

Code: Alles auswählen

In [1]: manufacturer_areas = [1,2,3,4,5,6,10,11,12,13,14,15]

In [2]: lowest, highest = min(manufacturer_areas), max(manufacturer_areas)

In [3]: gaps = set(range(lowest, highest+1)) - set(manufacturer_areas)

In [4]: gaps
Out[4]: {7, 8, 9}

In [5]: min(gaps), max(gaps)
Out[5]: (7, 9)
Die Prüfung auf Lückenlosigkeit kann man mit z. B. mit 'all' und einem Generatorausdrück in einer Zeile abhandeln.

Dein Code-Beispiel hält sich nicht an die Benennungskonvention; camelCase ist in Python absolut unüblich. Weiterhin sieht deine Funktion und nicht wie eine Methode aus; self wird aber per Konvention ausschließlich für das erste Argument einer Methode innerhalb eine Klasse verwendet.

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 15:37
von Sirius3
Klar ist das machbar.
Einfach die Liste durchgehen und prüfen, ob die Zahlenfolge aufsteigend ist.

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.
Warum steht da überall self, obwohl das nicht wirklich benutzt wird. Auch das fehlende `find_gaps` wird nichts sinnvolles mit self anfangen, oder?

Ähm, `find_gaps` liefert Dir doch schon die Zahlen, in dem Format, wie Du sie brauchst.

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 16:22
von Kalysto
Danke für die schnellen antworten.

Die Funktion steht in einer Klasse daher das self...
ist ja nur ein teil des Skriptes ;)

habe mich vllt falsch ausgedrückt...
neuer versuch:

Das hier ist nun eine etwas größere Liste mit Nummern:

Code: Alles auswählen

{651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502}
ich würde daraus nun gerne folgendes machen:

Code: Alles auswählen

{651-849, 1112-1502}
mit `min`, `max` komme ich hier leider nicht wirklich weiter...
danke aber für die fixe Hilfe :)

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 16:29
von Sirius3
@Kalysto: nicht alles was in einer Klasse, gehört da auch hin. Du hast hier zwei völlig generische Funktionen, find_gaps und fill_gaps, die nichts mit self machen.

Und wie ich schon schrieb, find_gaps liefert Dir schon das, was Du brauchst.

Code: Alles auswählen

def str_gaps(sorted_iterable):
    return ', '.join(f"{i+1}-{j-1}" if i+1 != j-1 else f"{i+1}" for i, j in find_gaps(sorted_iterable))

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 16:48
von Kalysto
Sirius3 hat geschrieben: Sonntag 22. November 2020, 16:29 @Kalysto: nicht alles was in einer Klasse, gehört da auch hin. Du hast hier zwei völlig generische Funktionen, find_gaps und fill_gaps, die nichts mit self machen.
d.h. allgemein alles was nichts mit self macht sollte ? oder muss ? außerhalb der klasse stehen ?
Sirius3 hat geschrieben: Sonntag 22. November 2020, 16:29 Und wie ich schon schrieb, find_gaps liefert Dir schon das, was Du brauchst.

Code: Alles auswählen

def str_gaps(sorted_iterable):
    return ', '.join(f"{i+1}-{j-1}" if i+1 != j-1 else f"{i+1}" for i, j in find_gaps(
Ich danke dir.....
hab ich übersehen :o

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 16:59
von snafu
Falls mehrere Dinge mit manufacturer_areas gemacht werden sollen, dann kann man die auch in __init__() übergeben und an das Objekt deiner Klasse binden. Die find_gaps()-Methode würde dann dementsprechend auf self.manufacturer_areas zugreifen und bräuchte es nicht mehr als Parameter anzunehmen. Ob das wirklich sinnvoll ist, hängt aber vom Anwendungsfall ab.

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 17:08
von Kalysto
manufacturer_areas brauche ich nur in einer Methode in keiner sonst...
also würde das dann außerhalb der class Methode stehen
dann müsste ich nochmal allgemein bei mir drüber schauen da ich alle Methoden in der class habe

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 17:35
von Sirius3
Du hast nur eine Klasse?

Code: Alles auswählen

def find_gaps(numbers):
    missing = set(range(min(numbers), max(numbers))) - set(numbers)
    while missing:
        first = min(missing)
        count = 0
        while first + count in missing:
            missing.remove(first + count)
            count += 1
        if count > 1:
            yield f"{first}-{first+count-1}"
        else:
            yield f"{first}"

', '.join(find_gaps([1,2,4,5,7,10,100]))

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 17:45
von Kalysto
hehe ne der Code von dir @Sirius3 Stimmte und geht ohne Probleme :)

mir ging es nur einmal um die grundlegende "Sortierung" der Methoden / Funktionen...
das ich weis wie man das richtig anordnen würde..

alles was kein self braucht und nur etwas zurück gibt über `return` z.b. sollte dann außerhalb einer Klasse sein ?

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 21:26
von __blackjack__
@Kalysto: Das kann man alles so pauschal nicht sagen. In die Klasse gehört was vom Sinn her sinnvoll zu der Klasse gehört. Das ist bei ”Methoden” die `self` nicht verwenden sehr oft der Fall. Aber auch bei solchen die `self` nur verwenden um auf Sachen zuzugreifen die eigentlich auch nicht in die Klasse gehören.

Re: Zahlenfolge in von bis umwandeln ?

Verfasst: Sonntag 22. November 2020, 22:34
von Kalysto
Okay danke muss ich mal schauen...