Zahlenfolge in von bis umwandeln ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

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.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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 :)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@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))
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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
Benutzeravatar
snafu
User
Beiträge: 6870
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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]))
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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 ?
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Okay danke muss ich mal schauen...
Antworten