我无法弄清楚如何搜索我拥有的嵌套列表,以便找到某些值,以便在有意义的情况下将不同的值添加到另一个嵌套列表中?我将尝试在下面解释。
list1 = [[P1, 3, P2, 1],[P3, 2, P4, 1][P5, 3, P6, 2]]
基本上,这个嵌套列表代表玩家之间游戏中的回合得分(P1对P2得分为3分,P2对P1得分为1分)。
我还有第二个嵌套列表:
list2 = [[P1], [P2], [P3], [P4], [P5], [P6]]
第二个嵌套列表将代表玩家之间的排名分数。我想要实现的是根据第一个嵌套列表中的玩家得分将排名分数插入第二个嵌套列表。例如,在“list1”P1中,P3和P5赢得了他们的回合,因此我想将“5”(用于演示目的的任意数字)的排名分数插入到这些玩家的“list2”中,为另一个玩家插入“0”玩家,以便列表看起来像这样:
list2 = [[P1, 5], [P2, 0], [P3, 5], [P4, 0], [P5, 5], [P6, 0]]
我正在努力弄清楚如何做到这一点背后的逻辑,所以任何帮助将不胜感激
谢谢,
答案 0 :(得分:1)
你可以试试这个:
P1 = "Team1"
P2 = "Team2"
P3 = "Team3"
P4 = "Team4"
P5 = "Team5"
P6 = "Team6"
n = 5
import itertools
list1 = [[P1, 3, P2, 1],[P3, 2, P4, 1], [P5, 3, P6, 2]]
final_data = list(itertools.chain(*[[[t1, n], [t2, 0]] if s1 > s2 else [[t1, 0], [t2, n]] for t1, s1, t2, s2 in list1]))
输出:
[['Team1', 5], ['Team2', 0], ['Team3', 5], ['Team4', 0], ['Team5', 5], ['Team6', 0]]
答案 1 :(得分:0)
使用dict
,您可以尝试类似
list1 = [["P1", 3, "P2", 1],["P3", 2, "P4", 1],["P5", 3, "P6", 2]]
playerDict = {"P1":0,"P2":0,"P3":0,"P4":0,"P5":0,"P6":0}
for entry in list1:
if entry[1] > entry[3]:
playerDict[entry[0]] = 5
else:
playerDict[entry[2]] = 5
playerDict的输出:
{'P1': 5, 'P3': 5, 'P6': 0, 'P2': 0, 'P5': 5, 'P4': 0}
如果您喜欢https://www.tutorialspoint.com/python/python_dictionary.htm,还有其他更多信息:)
答案 2 :(得分:0)
首次比较时,假设格式如下:
if (Application.Current.MainWindow != null)
{
Application.Current.MainWindow.Topmost=true;
}
您可以做的最基本的比较是:
list1 = [[P1, 3, P2, 1],[P3, 2, P4, 1][P5, 3, P6, 2]]
您可以改进for score_list in list1:
# score_list[1] and score_list[3] are the scores
if score_list[1] > score_list[3]:
# winner is player in score_list[0]
winner = score_list[0]
loser = score_list[2]
elif score_list[1] < score_list[3]:
winner = score_list[2]
loser = score_list[0]
else:
# what do you do in case of a tie?
pass
# now do something with the winner information
# if we're keeping list2 format, you'd have to scan
# the list until you find the one where the first element
# is the winner, and also do something for the loser
for player_list in list2:
if player_list[0] == winner:
player_list.append(5)
if player_list[0] == loser:
player_list.append(0)
处理,而不是使用字典,这样可以将键映射到值。
list2
答案 3 :(得分:0)
根据您的问题,我的猜测是列表不是任意嵌套的,并且您实际上并不搜索值,而是希望将嵌套列表转换为另一种形式。
然而,进一步思考你的榜样,我的猜测是,玩家可能会重复比赛,因此可能会有不止一场比赛?我的猜测也是在其中一场比赛中可能出现平局。
在任何一种情况下,查找逻辑都非常昂贵,我建议使用字典来计算点数。在那里,你可以简单地查找玩家名称P1, P2, ...
并增加存储在那里的点数。
在这种情况下,您可以迭代所有匹配,在移动中解压缩嵌套列表并比较点。根据比较结果,您可以相应地更新球员词典:
list1 = [["P1", 3, "P2", 1], ["P3", 2, "P4", 1], ["P5", 3, "P6", 2]]
player_points = {}
for player_1_name, player_1_points, player_2_name, player_2_points in list1:
if player_1_points > player_2_points:
player_1_points = 5
player_2_points = 0
elif player_1_points < player_2_points:
player_1_ponints = 0
player_2_points = 5
else: # Player 1 and 2 are tied
player_1_points = 2
player_2_points = 2
if player_1_name not in player_points:
player_points[player_1_name] = 0
if player_2_name not in player_points:
player_points[player_2_name] = 0
player_points[player_1_name] += player_1_points
player_points[player_2_name] += player_2_points
运行后,字典将如下所示:
{'P2': 0, 'P3': 5, 'P1': 5, 'P6': 0, 'P4': 0, 'P5': 5}
如果你真的想要一个元组列表,你可以将字典转换成这样的列表:
list2 = list(player_points.items())
输出:
[('P2', 0), ('P3', 5), ('P1', 5), ('P6', 0), ('P4', 0), ('P5', 5)]
如果你真的还需要里面的列表,这就可以解决问题:
list2 = [list(item) for item in player_points.items()]
输出:
[['P2', 0], ['P3', 5], ['P1', 5], ['P6', 0], ['P4', 0], ['P5', 5]]
您甚至可以通过播放sorted
:
list2 = [list(item) for item in sorted(player_points.items())]
输出:
[['P1', 5], ['P2', 0], ['P3', 5], ['P4', 0], ['P5', 5], ['P6', 0]]
答案 4 :(得分:0)
另一个不那么优雅但功能性的解决方案是:
list1 = [['P1', 3, 'P2', 1],['P3', 2, 'P4', 1],['P5', 3, 'P6', 2]]
list2 = []
def takeScore(list1, list2, number):
for i in list1:
if i[1] > i[3]:
list2.extend(([i[0],number],[i[2],0]))
else:
list2.extend(([i[1],0],[i[2],number]))
takeScore(list1,list2,5)
print(list2)
结果是:
[['P1', 5], ['P2', 0], ['P3', 5], ['P4', 0], ['P5', 5], ['P6', 0]]