Python列表 - 找到具有最小值的元组,但在

时间:2016-06-20 00:41:49

标签: python-2.7

我有一个元组列表。这些元组包括整数值和类别。

mylist = ((1,catA),(1,catB),(2,catA),..)

我的目标是从列表中选择一个值为最小值的元组。可能有一个或多个元组具有值=最小值。在上面的示例中,最小值为1,CatA和CatB都具有值=最小值。

获得我使用的最小值:

min_value = min(mylist , key=lambda x: x[0])[0]

要选择值为= min_value的元组,我使用了:

min_tuple = min([x for x in mylist if x[0] == min_value])

但是我想随机化排序顺序,以便所选元组并不总是具有相同的类别。

我在选择min_tuple之前尝试使用shuffle,但这并没有改变选择顺序。

random.shuffle(mylist)
min_tuple = min([x for x in mylist if x[0] == min_value])

所以我猜测min_tuple表达式是自己的排序。这是真的?如果为true,min_tuple表达式排序是否可以随机化,因为它选择一个值为value = min_value的元组?

编辑添加:

我从其他SO问题/答案以及其他地方了解random.choice,但我的问题主要集中在min tuple表达式上,具体如何/如果它在列表中找到最小值时是否排序了元组。

我的特定配方也错误地或不必要地为min value做了“双重过滤”(例如== min_valuemin())。我在此收到的答案更正了这种用法,并将random.choice作为我具体方法的修改。

1 个答案:

答案 0 :(得分:3)

计算class Does implements Runnable { C2 c2; Does(C2 c2) { this.c2 = c2; } public void run() { c2.put("Hello"); } } public class C2 { public ConcurrentHashMap<String, List<String>> map = new ConcurrentHashMap<String, List<String>>(); public static void main(String args[]) { C2 c2 = new C2(); new Thread(new Does(c2)).start(); new Thread(new Does(c2)).start(); new Thread(new Does(c2)).start(); new Thread(new Does(c2)).start(); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } List<String> lu = c2.map.get("Hello"); System.out.println(lu); } /** * @param string */ public void put(String string) { if (map.containsKey(string)) { List<String> li = map.get(string); li.add("adding something"); } else { List<String> li = new ArrayList<String>(); li.add("adding something"); map.put(string, li); } } } min调用意味着您总是会使用比较最小的类别来获取元组。如果那是你真正想要的,你应该min_tuple完成它。

如果您想从具有最小值的元组中随机选择,请将min(mylist)替换为min

random.choice

请注意,我已将min_value = min(x[0] for x in mylist) min_tuple = random.choice([x for x in mylist if x[0] == min_value]) 的计算更改为更直接的工作(而不是找到具有最小值的第一个元组,然后仅从中提取值)。原来的方式也会很好。