匹配新字典中的字典键和值

时间:2021-02-19 15:40:56

标签: python list dictionary

我尝试将字典中的键和值匹配在一起,并将它们放入一个新字典中。

我最初的字典是这样的:

d = {1: [5,6], 3: [4], 8: [2,3]}

我知道我可以使用 d.keys()d.values() 访问键和值。

我的目标是找到所有相关的项目。我认为最好解释一下我想要的输出。

我希望创建一个新的字典来给我:

finaldict = {1: [5,6], 2: [3,4,8], 3: [2,4,8], 4:[2,3,8] 5:[1,6], 6:[1,5], 8:[2,3,4]}

也就是说,我想获取所有数字的键,并为它们所关联的数字赋值。

我的尝试:

d = {1: [5,6], 3:[4],8:[2,3]}
print(d)
keys = list(d.keys())
vals = list(d.values())
for i in range(0,len(d.keys())):
    current_vals = list(vals[i])
    length = len(current_vals)
    for v in current_vals:
        if v in d.keys(): #if the dictionary exists, then append
            add = [keys[i],current_vals]
            d[v].append(add)
        else:
            add2 = [keys[i],current_vals]
            empty = []
            for a in add2:
                if type(a) == int:
                    empty.append(a)
                if type(a) == list:
                    for b in a:
                        empty.append(b)
            d[v] = empty

keys = list(d.keys())
vals = list(d.values())
for i in range(0,len(keys)):
    if keys[i] in vals[i]:
        vals[i].remove(keys[i])

finaldict = {}
for j in range(0,len(keys)):
    finaldict[keys[j]] = vals[j]

print("Final dict:\n",finaldict)

我的尝试给了我输出

Final dict:

 {1: [5, 6], 3: [4, [8, [2, 3]]], 8: [2, 3], 5: [1, 6], 6: [1, 5], 4: [3], 2: [8, 3]}

如您所见,finaldict[3] 的值为 [4, [8, [2, 3,]]]。 值本身是错误的(3 不应该在那里),而且我希望这是一个单一的列表,而不是现在的格式。还有其他问题,例如 finaldict[2] 具有值 [8, 3],而实际上它应该具有值 [3, 4, 8]finaldict[4] 仅具有 [3],什么时候应该有 [2, 3, 8]

3 个答案:

答案 0 :(得分:3)

不是我写过的最漂亮的代码,但它就是这样。

我用所有相互关联的数字创建集合,然后创建一个字典,其中每个数字作为键,其他数字作为值。

d = {1: [5,6], 3: [4], 8: [2,3]}

pools = []
for key,values in d.items():
    for pool in pools:
        if key in pool or any(val in pool for val in values):
            pool.add(key)
            [pool.add(val) for val in values]
            break
    else:
        pools.append(set((key, *values)))
#pools = [{1, 5, 6}, {8, 2, 3, 4}]
finaldict = {k:set.difference(v, set((k,))) for pool in pools for k, v in zip(pool, [pool]*len(pool))}
print(finaldict)

答案 1 :(得分:1)

您可以通过合并相关组并将相同的合并组分配给属于其中的每个键来构建结果字典:

d = {1: [5,6], 3: [4], 8: [2,3]}

related = dict()
for key,group in d.items(): # merge/assign groups to keys
    merged = set(group).union({key},*(related.get(k,[]) for k in group))
    related.update((k,merged) for k in merged)
related = {k:list(g-{k}) for k,g in related.items()} # exclude key from group

print(related)
{1: [5, 6], 5: [1, 6], 6: [1, 5], 3: [8, 2, 4], 4: [8, 2, 3], 
 2: [8, 3, 4], 8: [2, 3, 4]}

答案 2 :(得分:1)

您可以使用递归:

{1: [5, 6], 5: [1, 6], 6: [1, 5], 3: [8, 2, 4], 4: [8, 2, 3], 8: [2, 3, 4], 2: [8, 3, 4]}

输出:


import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import testone2.firstTest;

import java.io.*;

public class testLogin {

    protected WebDriver driver;
    private int seconds;

    public testLogin() {
        super();
    }

    @BeforeTest
    public void beforeTest() {
        //Download the web driver executable
        String chromeVersion = null;
        try {
            FileReader reader = new FileReader("chromeVersion.txt");
            BufferedReader br = new BufferedReader(reader);

            String line;

            while ((line = br.readLine()) != null) {
                chromeVersion = line.trim();
            }
            reader.close();
        } catch (IOException e) {
            Throwable ioException = new Throwable();
            ioException.printStackTrace();
        }

        WebDriverManager.chromedriver().version(chromeVersion).setup();
        boolean oldVersion = false;
        try {
            driver = new ChromeDriver();
        } catch (Exception e) {
            oldVersion = false;
            String err = e.getMessage();
            chromeVersion = err.split("version is")[1].split("with binary path")[0].trim();
            try {
                FileWriter writer = new FileWriter("chromeVersion.txt", true);
                writer.write(chromeVersion);
                writer.close();
            } catch (IOException er) {
            }
        }


        if (!oldVersion) {
            WebDriverManager.chromedriver().version(chromeVersion).setup();
            driver = new ChromeDriver();
        }

    }


    public void sleep(int seconds) {
        try {
            Thread.sleep(seconds * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}