def groupCitiesByRotatedName(A):
"""Groups cities by anagram pairs"""
result = [[city] for city in A]
anagramMap = {}
for index, city in enumerate(A):
if city.lower() in anagramMap:
origMapIndex = anagramMap[city.lower()]
result[origMapIndex].append(city)
continue
rotatedCities = rotateString(city.lower())
# add rotated items to map
anagramMap = {**anagramMap, **{i: index for i in rotatedCities}}
return result
def rotateString(string):
"""Rotates all possible combinations of a string and returns a list"""
N = len(string)
string += string
rotatedStrings = []
for i in range(1, N):
rotatedStrings += [string[i:N + i]]
return rotatedStrings
def main():
# A = [i for i in input().split()]
A = ['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris']
groupedA = groupCitiesByRotatedName(A)
print(groupedA)
if __name__ == "__main__":
main()# your code goes here
CmRlZiBncm91cENpdGllc0J5Um90YXRlZE5hbWUoQSk6CiAgICAiIiJHcm91cHMgY2l0aWVzIGJ5IGFuYWdyYW0gcGFpcnMiIiIKICAgIHJlc3VsdCA9IFtbY2l0eV0gZm9yIGNpdHkgaW4gQV0KICAgIGFuYWdyYW1NYXAgPSB7fQogICAgZm9yIGluZGV4LCBjaXR5IGluIGVudW1lcmF0ZShBKToKICAgICAgICBpZiBjaXR5Lmxvd2VyKCkgaW4gYW5hZ3JhbU1hcDoKICAgICAgICAgICAgb3JpZ01hcEluZGV4ID0gYW5hZ3JhbU1hcFtjaXR5Lmxvd2VyKCldCiAgICAgICAgICAgIHJlc3VsdFtvcmlnTWFwSW5kZXhdLmFwcGVuZChjaXR5KQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICByb3RhdGVkQ2l0aWVzID0gcm90YXRlU3RyaW5nKGNpdHkubG93ZXIoKSkKICAgICAgICAjIGFkZCByb3RhdGVkIGl0ZW1zIHRvIG1hcAogICAgICAgIGFuYWdyYW1NYXAgPSB7KiphbmFncmFtTWFwLCAqKntpOiBpbmRleCBmb3IgaSBpbiByb3RhdGVkQ2l0aWVzfX0KICAgIHJldHVybiByZXN1bHQKCgpkZWYgcm90YXRlU3RyaW5nKHN0cmluZyk6CiAgICAiIiJSb3RhdGVzIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBsaXN0IiIiCiAgICBOID0gbGVuKHN0cmluZykKICAgIHN0cmluZyArPSBzdHJpbmcKICAgIHJvdGF0ZWRTdHJpbmdzID0gW10KICAgIGZvciBpIGluIHJhbmdlKDEsIE4pOgogICAgICAgIHJvdGF0ZWRTdHJpbmdzICs9IFtzdHJpbmdbaTpOICsgaV1dCiAgICByZXR1cm4gcm90YXRlZFN0cmluZ3MKCgpkZWYgbWFpbigpOgogICAgIyBBID0gW2kgZm9yIGkgaW4gaW5wdXQoKS5zcGxpdCgpXQogICAgQSA9IFsnVG9reW8nLCAnTG9uZG9uJywgJ1JvbWUnLCAnRG9ubG9uJywgJ0t5b3RvJywgJ1BhcmlzJ10KICAgIGdyb3VwZWRBID0gZ3JvdXBDaXRpZXNCeVJvdGF0ZWROYW1lKEEpCiAgICBwcmludChncm91cGVkQSkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpIyB5b3VyIGNvZGUgZ29lcyBoZXJl