Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果两个列表元素都必须包含另一个指定值,是否有一种有效的方法来查找两个列表元素的共享值?_Python_List_Dictionary_Optimization_List Comprehension - Fatal编程技术网

Python 如果两个列表元素都必须包含另一个指定值,是否有一种有效的方法来查找两个列表元素的共享值?

Python 如果两个列表元素都必须包含另一个指定值,是否有一种有效的方法来查找两个列表元素的共享值?,python,list,dictionary,optimization,list-comprehension,Python,List,Dictionary,Optimization,List Comprehension,这个问题有点难以在一行问题中简单解释,因此我将首先给出我的代码,并说明打印的值是正确的结果: valin = 4 valout = 3 gdict = { (0,3): 0, (1,3): 1, (2,3): 2, (0,4): 3, (4,3): 4, (0,5): 5, (5,4): 6, (4,6): 7, (6,3): 8, }

这个问题有点难以在一行问题中简单解释,因此我将首先给出我的代码,并说明打印的值是正确的结果:

valin = 4
valout = 3

gdict = {
        (0,3): 0,
        (1,3): 1,
        (2,3): 2,
        (0,4): 3,
        (4,3): 4,
        (0,5): 5,
        (5,4): 6,
        (4,6): 7,
        (6,3): 8,
        }

keys = list(gdict)
nin = [x for x in keys if x[0]==valin]
nout = [x for x in keys if x[1]==valout]

shared_val_from_vals = [x[1] for x in nin for y in nout if x[1]==y[0]][0]

print(shared_val_from_vals)
___________________________
6
我有两个价值观:valin和valout。我在找

  • 第0个元素等于valin和
  • 第1个元素等于valout和
  • 第一个键的第一个元素等于第二个键的第0个元素
  • 然后我将把这个共享值用于代码的另一部分


    虽然我的代码完成了任务,但这段代码将用于大型字典,因此如果可以的话,我想优化这些操作。是否有一种更具python风格或更简洁的方法来实现此结果?

    您只能使用单个for循环来压缩它:

    nin_out = [x for x in keys if x[0]==valin or x[1]==valout]
    shared_val_from_vals = [x[1] for x in nin_out for y in nin_out if x[1]==y[0]][0]
    

    循环字典键,创建匹配每个条件的元组元素集。然后将两个集合相交

    set_in = {}
    set_out = {}
    for in_var, out_var in gdict:
        if in_var == valin:
            set_out.append(out_var)
        if out_var == valout:
            set_in.append(in_var)
    shared_val = set_in.intersect(set_out).pop()
    

    看起来你的代码已经优化了。也许你可以将代码与你的大字典一起使用,并评估运行时……是的,我知道我的代码不是超级复杂的,我只是想看看是否有一种方法,我不必在字典上循环两次,然后在那些列表上循环两次,修复了varsThank you!这大大减少了总操作量。我可能会使用它的一个变体,我可能会首先附加到列表,转换为集合,然后使用交集。为什么要先创建中间列表,除非您需要它们来做其他事情?因为附加到列表比附加到集合要快一些,所以如果您先将它们作为列表创建,请附加您需要的所有内容,然后转换成集合来寻找交点,会有点faster@Nbishop直观地说,我希望添加到集合中会更快,因为将列表转换为集合本质上与将其所有元素添加到集合中是相同的。但是在的基准测试表明转换速度更快(虽然不是很大幅度)。是的,我指的是单代码,而不是原始代码中两个不同的
    nin
    nout