Erstellen Sie eine Funktion, mit der die Elimination -Logik verwendet werden kann, um eine Liste von Zeichenfolgen in SuPython

Python-Programme
Anonymous
 Erstellen Sie eine Funktion, mit der die Elimination -Logik verwendet werden kann, um eine Liste von Zeichenfolgen in Su

Post by Anonymous »

Ich habe eine Liste von Zeichenfolgen, in denen jede Zeichenfolge die Namen zweier Tennisspieler darstellt, die in einem Spiel gespielt haben. Die Liste der Strings kollektiv ist in einem Turnier bekannt. Ein Beispiel für eine Zeichenfolge wäre: < /p>
"halep-simona-williams-serena"
< /code>
Ich möchte jede Zeichenfolge in ein Tupel von zwei Zeichenfolgen teilen: < /p>
("halep-simona", "williams-serena")
< /code>
Angegebenen String ist dies eindeutig nicht möglich, aber angesichts einer Liste von Zeichenfolgen, die ein Turnier von Spielen darstellen, bei dem die Spieler gegenseitig gespielt haben, hofft ich, dass es eine Möglichkeit gibt, die Eliminierungslogik zu verwenden, um die Namen aufzuteilen.def split_into_names(urls: list[str]) -> list[tuple[str | None, str | None]]:
matchups = list()
for idx, url in enumerate(urls):
other_urls = urls[:idx] + urls[idx + 1 :]
full_name_combo = get_name_combo(
url=url,
other_urls=other_urls,
)
matchups.append(full_name_combo)

return matchups

def get_name_combo(url: str, other_urls: list[str]) -> tuple[str | None, str | None]:
full_name_combos = generate_potential_name_combos(url)
for full_name_combo in full_name_combos:
if check_name_combo(
full_name_combo=full_name_combo,
url=url,
other_urls=other_urls,
):
return full_name_combo

else:
return (None, None)

def generate_potential_name_combos(url: str) -> list[tuple[str, str]]:
parts = url.split("-")
full_names = list()
for i in range(1, len(parts)):
p1 = "-".join(parts[:i])
p2 = "-".join(parts[i:])
full_names.append((p1, p2))

return full_names

def check_name_combo(
full_name_combo: tuple[str, str],
url: str,
other_urls: list[str],
) -> bool:
for full_name in full_name_combo:
for idx, check_url in enumerate(other_urls):
# can't eliminate url name options if both players have
# played each other previously in the same order
if check_url == url:
continue
check_url_part = check_url.partition(full_name)
# can't check url if name not present
if not check_url_part[1]:
continue
# can't be correct if full name splits the url into three
elif check_url_part[0] and check_url_part[2]:
continue
# this is the correct split so need to exit here with the answer
elif check_url_part[0] and not check_url_part[2]:
return True
elif not check_url_part[0] and check_url_part[2]:
clean_potential_name = check_url_part[2].strip("-")
remaining_urls = other_urls[:idx] + other_urls[idx + 1 :]
for remaining_url in remaining_urls:
if remaining_url == check_url:
continue
elif clean_potential_name in remaining_url:
return True
else:
pass

return False
< /code>
Wenn ich das oben genannte ausführe, kann ich eine Liste der Beispielzeichen für reale Leben abschließen. Wenn ich jedoch anfange, einige komplexere Kantenfälle zu erstellen, bin ich in Schwierigkeiten. Hier ist der Code zum Testen der Listen des realen Lebens und der Rande: < /p>
def main():
names = [
"halep-simona-williams-serena",
"radwanska-agnieszka-halep-simona",
"williams-serena-wozniacki-caroline",
"halep-simona-ivanovic-ana",
"kvitova-petra-wozniacki-caroline",
"sharapova-maria-radwanska-agnieszka",
"williams-serena-bouchard-eugenie",
"sharapova-maria-kvitova-petra",
"radwanska-agnieszka-wozniacki-caroline",
"bouchard-eugenie-ivanovic-ana",
"williams-serena-halep-simona",
"kvitova-petra-radwanska-agnieszka",
"sharapova-maria-wozniacki-caroline",
"halep-simona-bouchard-eugenie",
"williams-serena-ivanovic-ana",
]

result = split_into_names(names)

# success :-)
assert result == [
("halep-simona", "williams-serena"),
("radwanska-agnieszka", "halep-simona"),
("williams-serena", "wozniacki-caroline"),
("halep-simona", "ivanovic-ana"),
("kvitova-petra", "wozniacki-caroline"),
("sharapova-maria", "radwanska-agnieszka"),
("williams-serena", "bouchard-eugenie"),
("sharapova-maria", "kvitova-petra"),
("radwanska-agnieszka", "wozniacki-caroline"),
("bouchard-eugenie", "ivanovic-ana"),
("williams-serena", "halep-simona"),
("kvitova-petra", "radwanska-agnieszka"),
("sharapova-maria", "wozniacki-caroline"),
("halep-simona", "bouchard-eugenie"),
("williams-serena", "ivanovic-ana"),
]

names = [
"test-test-test-test-test", # I don't think this can ever be split...
"test-test-test-test-test-phil",
"test-test-test-test-matt",
"test-test-test-test-test-james",
"test-test-kris-test-test",
"test-test-bob-test-test-phil",
"test-test-rich-test-test-matt",
]

result = split_into_names(names)

# fail :-(
assert result == [
("test-test", "test-test-test"),
("test-test-test", "test-test-phil"),
("test-test", "test-test-matt"),
("test-test-test", "test-test-james"),
("test-test-kris", "test-test"),
("test-test-bob", "test-test-phil"),
("test-test-rich", "test-test-matt"),
]

if __name__ == "__main__":
main()
< /code>
WICHTIG: Ich brauche keine weniger komplexe Lösung für die realen Fälle. Ich brauche eine Lösung für die Kantenfälle. Wenn ja, wie würde ich meinen Code so anpassen, dass die Kantenfälle passieren? Ich kann jedoch keine zurückgegebenen Tupel haben, die falsch sind.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post