我有一个元组列表。这些元组包括整数值和类别。
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_value
和min()
)。我在此收到的答案更正了这种用法,并将random.choice
作为我具体方法的修改。
答案 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])
的计算更改为更直接的工作(而不是找到具有最小值的第一个元组,然后仅从中提取值)。原来的方式也会很好。