Python 2.7 字典:值为列表类型的唯一相对值

Python 2.7 字典:值为列表类型的唯一相对值,python-2.7,dictionary,nlp,tensorflow,text-classification,Python 2.7,Dictionary,Nlp,Tensorflow,Text Classification,我得到word2vec_basic.py的输出,格式如下 最靠近键1的节点:节点1、节点2、节点3。。 最靠近键2的节点:节点2、节点4、节点5 这意味着node2比key1更接近key2(如果我错了,请纠正我,因为我是这里的新手) 如果我得到以下格式的输出就太好了 最靠近键1的节点:节点1、节点3、节点6。。 最靠近键2的节点:节点2、节点4、节点5 即,只考虑最接近的邻居进行聚类。 同样的建议 我正在维护一个python字典,其格式如下: { key1: [node1,node2,node3

我得到word2vec_basic.py的输出,格式如下

最靠近键1的节点:节点1、节点2、节点3。。 最靠近键2的节点:节点2、节点4、节点5

这意味着node2比key1更接近key2(如果我错了,请纠正我,因为我是这里的新手)

如果我得到以下格式的输出就太好了

最靠近键1的节点:节点1、节点3、节点6。。 最靠近键2的节点:节点2、节点4、节点5

即,只考虑最接近的邻居进行聚类。 同样的建议

我正在维护一个python字典,其格式如下:

{
key1: [node1,node2,node3],
key2: [node2,node4,node5]
}
但我要求,

 {
    key1: [node1,node3,node6],
    key2: [node2,node4,node5]
    }
对于上面的字典,我需要

Nearest to key1  : node1, node3 , node6..
Nearest to key2 : node2, node4, node5 ..
我们可以在tensorflow本身中这样做吗,或者我应该定义一个以字典作为输入并提供所需输出的函数吗

例如: 如果我们有以下格式的python字典:

{ 
   a: ["abc","bcd","def"],
   b: ["def","xyz"]
}
这里列出了这些值。我正在从上述输入中查找以下格式:

{ 
    a: ["abc","bcd"],
    b: ["def","xyz"]
}
欢迎就如何实现这一目标提出建议

另外,是否有任何python内置函数可以帮助我达到上述输出格式

DICT是无序的,因此不保证删除哪个dupe,但您可以在迭代项时保留一组元素,如果已经看到,则更新/删除列表/值中的元素:

这可能会产生:

{'b': ['def', 'xyz'], 'a': ['abc', 'bcd']}
或:

这完全取决于你先按哪个键


正如您在436次投票中所看到的,删除逻辑是有效的,如果需要,它会保持顺序。为了避免每次都像在链接中一样进行set.add查找,您可以设置
seen\u add=seen.add
并使用
seen.\u add(ele)
代替
seen.add
因为Python中的字典条目是无序的,所以您需要首先构建一个由记录每个列表(或序列)的节点键入的单独字典它和它的索引都在那个列表中,所以每个列表中的相对距离可以相互比较。完成后,可以通过第二次遍历字典的内容来引用它,以确定每个节点是否应该保留在它所在的每个列表中

d = {
   "a": ["abc", "bcd", "def"],
   "b": ["def", "xyz"]
}

def check_usage(k, elem_usage):
    if len(elem_usage) == 1:  # unique?
        return True
    else:
        index = elem_usage[k]  # within this elem's seq
        for key,value in elem_usage.items():
            if key != k:
                if value < index:
                    return False
        else:
            return True

usage = {}
for key in d:  # build usage dictionary
    for index, item in enumerate(d[key]):
        usage.setdefault(item, {})[key] = index

for k,seq in d.items()::  # remove nodes that are closer in other lists
    d[k] = [elem for elem in seq if check_usage(k, usage[elem])]

# display results
print('{')
for k in sorted(d):
    print('    {!r}: {},'.format(k, d[k]))
print('}')

为什么不从b中删除def?为什么不将“def”保留在
a
中,并从
b
中删除-与您正试图实现的目标相关的值?特别不清楚的是,因为您没有包含任何可能提供额外线索的代码。我编辑了我的问题,以解释它是如何需要的。您的更新有助于澄清您想要做什么,我已根据它提交了答案。请尝试一下,并提供一些反馈。与上面的问题相关:要实现这一点,您需要依赖python语言(实现)的两个模糊属性。为什么不把你的代码分成3行,这是任何一个计算机科学专业一年级学生都能理解的?@BiRico,你对高效代码的使用投了反对票,做得好。OP要求一种方法,我提供了。我应该增加一种效率较低的方法吗?@Padraiccningham谢谢!那看起来不错。。我也在探索tensorflow,如果我们能在word2vec_basic中实现的话(我已经更新了我的问题,说明了我是如何使用它的)…尽管你的解决方案同样不错!再次感谢!
 d = { "a": ["abc","bcd","def"], "b": ["xyz"]}
d = {
   "a": ["abc", "bcd", "def"],
   "b": ["def", "xyz"]
}

def check_usage(k, elem_usage):
    if len(elem_usage) == 1:  # unique?
        return True
    else:
        index = elem_usage[k]  # within this elem's seq
        for key,value in elem_usage.items():
            if key != k:
                if value < index:
                    return False
        else:
            return True

usage = {}
for key in d:  # build usage dictionary
    for index, item in enumerate(d[key]):
        usage.setdefault(item, {})[key] = index

for k,seq in d.items()::  # remove nodes that are closer in other lists
    d[k] = [elem for elem in seq if check_usage(k, usage[elem])]

# display results
print('{')
for k in sorted(d):
    print('    {!r}: {},'.format(k, d[k]))
print('}')