用最高优先级列表替换元组的Python列表

4

我有这些Python列表:

x = [('D', 'F'), ('A', 'D'), ('B', 'G'), ('B', 'C'), ('A', 'B')]
priority_list = ['A', 'B', 'C', 'D', 'F', 'G'] # Ordered from highest to lowest priority

如何针对列表中的每个元组,根据 priority_list 中的最高优先级保留值?结果将是:

['D', 'A', 'B', 'B', 'A']

另外一些例子:

x = [('B', 'D'), ('E', 'A'), ('B', 'A'), ('D', 'F'), ('E', 'C')]
priority_list = ['A', 'B', 'C', 'D', 'E', 'F']
# Result:
['B', 'A', 'A', 'D', 'C']

x = [('B', 'C'), ('F', 'E'), ('B', 'A'), ('D', 'F'), ('E', 'C')]
priority_list = ['F', 'E', 'D', 'C', 'B', 'A'] # Notice the change in priorities
# Result:
['C', 'F', 'B', 'F', 'E']

提前感谢,我可能过于复杂化了这个问题。


4
请澄清您的逻辑,期望结果是如何组成的? - RomanPerekhrest
1
看起来你只是从每个元组中取第一个值,那么map和operator.itemgetter会起作用,或者使用非常简单的列表推导式。 - Jab
2
样例数据是误导性的。我们这里甚至不需要 priority_list。只需取每个元组的第一个元素即可...它已经吸引了很多答案,但我们不知道真正的测试用例。 - Jean-François Fabre
1
@Waroulolz:对于 x = [('D', 'F'), ('A', 'D'), ('B', 'G'), ('B', 'C'), ('B', 'A')],输出会是什么?你能添加更多的元组以使其更清晰吗? - CristiFati
5个回答

7
你可以尝试。
[sorted(i, key=priority_list.index)[0] for i in x]

虽然如果您发现一个不在优先级列表中的值,它将抛出异常。


4
sorted(…, key=…)[0] 可以替换为 min(…, key=…)。意思是使用 min() 函数代替 sorted() 函数来获取可迭代对象中的最小值,两者的区别在于 min() 函数只返回单个最小值,而 sorted() 函数返回一个排序后的列表。 - eumiro

2

You can try:

def get_priority_val(data, priority_list):
    for single_val in priority_list:
        if single_val in data:
            return single_val


x = [('D', 'F'), ('A', 'D'), ('B', 'G'), ('B', 'C'), ('A', 'B')]
priority_list = ['A', 'B', 'C', 'D', 'F', 'G']
final_data = []

for data in x:
    final_data.append(get_priority_val(data, priority_list))

print(final_data)

输出:

['D', 'A', 'B', 'B', 'A']

2
你可以尝试使用列表推导式:

你可以尝试使用列表推导式:

最初的回答
ans = [d[0]  if priority_list.index(d[0]) < priority_list.index(d[1] )  else d[1] for d in x ]

输出:

['D', 'A', 'B', 'B', 'A']

1

您可以使用列表推导式在一行中完成它:

[y[0] if priority_list.index(y[0]) < priority_list.index(y[1]) else y[1] for y in x]

输出:
['D', 'A', 'B', 'B', 'A']

0
你可以创建一个包含优先级值的字典,并使用自定义键来调用 min 函数。
>>> priority_dict = {k:i for i,k in enumerate(priority_list)}
>>> [min(t, key=priority_dict.get) for t in x]
['D', 'A', 'B', 'B', 'A']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接