我很难理解你对嵌套结构的这种重新构造的想法,但是经过大量思考和编写代码,我相信我理解了,所以我猜这就是你想要的-代码和在线演示中的描述:
https://repl.it/repls/EarlyWeeklyThings
-是一个很好的挑战,谢谢
from pprint import pprint
# dummy user class
class User(object):
def __init__(self, user_id):
self.user_id = user_id
def __repr__(self):
return "User{}".format(self.user_id)
# dummy invite class
class UserInvite(object):
def __init__(self, from_user, to_user):
self.from_user = from_user
self.to_user = to_user
def __repr__(self):
return "From {} to {}".format(self.from_user, self.to_user)
# create 10 dummy users to create invites
users = [User(user_id) for user_id in range(1,11)]
# use natural numbers to reflect invites
# adjust in list comprehension
invite_map = (
(1, 3), (1, 5),
(2, 4), (2, 6),
(3, 7), (3, 8),
(4, 9),
(9, 10)
)
# create invitations based on the invite_map, fix natural numbers
example_invites = [
UserInvite(users[inviter-1], users[invitee-1]) for inviter, invitee in invite_map
]
pprint(example_invites)
# =>
# [From User1 to User3,
# From User1 to User5,
# From User2 to User4,
# From User2 to User6,
# From User3 to User7,
# From User3 to User8,
# From User4 to User9,
# From User9 to User10]
def get_nested_invites(invites, invited_by=None):
result = []
if not invited_by:
# Assume that initial inviters were not invited by anyone
# Use set comprehensions to avoid duplicates and for performance
invitees = {invite.to_user for invite in invites}
inviters = {invite.from_user for invite in invites if invite.from_user not in invitees}
else:
# Get the next potential inviters given their inviter
# Use set comprehension to avoid duplicates and for performance
inviters = {invite.to_user for invite in invites if invite.from_user == invited_by}
for inviter in inviters:
# Add the invited user/potential inviter
result.append(inviter)
# Let's get nesty
invitees = get_nested_invites(invites, inviter)
if invitees:
result.append(invitees)
return result
pprint(get_nested_invites(example_invites))
# =>
# [User1,
# [User3, [User7, User8], User5],
# User2,
# [User6, User4, [User9, [User10]]]]
pprint(get_nested_invites(example_invites, users[1]))
# =>
# [User6, User4, [User9, [User10]]]