【问题标题】:Combining and associating multiple dictionaries组合和关联多个字典
【发布时间】:2014-05-09 17:06:22
【问题描述】:

我想生成一个字典,其中组织了三组不同图片的六种不同组合。这就是我计算字典的原因:

import glob, os, random, sys, time
import numpy.random as rnd

im_a = glob.glob('./a*')   # upload pictures of the a-type, gives out a List of .jpg-files
im_n = glob.glob('./n*')   # n-type
im_e = glob.glob('./e*')   # e-type

# combining Lists of Pictures
A_n = im_a + im_n
N_a = im_n + im_a
A_e = im_a + im_e
E_a = im_e + im_a
E_n = im_e + im_n
N_e = im_n + im_e

# making a Dictionary of Pictures and Conditions
PicList = [A_n, N_a, A_e, E_a, E_n, N_e]   # just the six Combinations
CondList = [im_a,im_n,im_a,im_e,im_e,im_n] # images that are in the GO-Condition
ImageList = []
ImageList.append({'PicList':PicList, 'CondList':CondList})

此时有两个问题:

  1. 首先,有没有更好的方法来组合两个图片列表和第二个
  2. 如果我以这种方式组织字典,CondListPicList 不匹配。最好将PicList 直接关联到CondList。其中PicList A_nCondList im_aN_a-im_n, A_e-im_a 相关联...

【问题讨论】:

  • 嗨@Jakob,目前,对于 StackOverflow,这不是很好的公式。你有很多子问题,没有人可能能够回答所有这些问题。如果您得到多个部分答案,那么您将无法指定一个作为“正确”答案。我建议将其分解为多个问题。例如关于组合列表和填充字典的第一部分确实是非常普遍的 Python 问题,如果不隐藏在一个标记为专注于 PsychoPy 中特定 TrialHandler 类的问题中,可能会获得更广泛的受众。
  • 好的,谢谢。我试着听从你的建议,把问题一分为二!这是第二个问题:stackoverflow.com/questions/23605013/…
  • 我不太确定我了解您想要做什么。一方面,组合列表只是两个列表的串联。这真的是你想要的吗?其次,您能否详细说明“将 PicList 直接关联到 CondList”是什么意思?假设每种类型都有 2 个文件(a1.jpg、a2.jpg、n1.jpg、...),请说明您想对这些图像做什么。
  • 1.是的,我需要集中两个列表,而 A_n = im_a + im_n 给了我想要的东西,但是如果我有更多列表,我想寻求一种更简单的方法来组合这两个列表。 2. 如果我有一个“集中”列表 A_n (a1.jpg, a2.jpg, n1.jpg, n2.jpg) 我想将此列表关联到列表 im_a (a1.jpg, a2.jpg) 只是为了python 哪些图像在A_n列表中占主导地位的信息。我的想法是一个字典,分别看起来像这样 ({A_n:im_a}) ({(a1.jpg, a2.jpg, n1.jpg, n2.jpg):(a1.jpg, a2.jpg)}),这 - 当然 - 不起作用。

标签: python dictionary


【解决方案1】:

回答第一点可以使用itertools.permutations

import itertools as it

elements = [im_a, im_n, im_e]
perms = it.permutations(elements, 2)    # 2 -> take pairs
pic_list = [sum(perm, []) for perm in perms]

返回的顺序是字典顺序,即

im_a + im_n, im_a + im_e, im_n + im_a, im_n + im_e, im_e + im_a, im_e + im_n

相应的cond_list 可以通过简单的操作来构建:

cond_list = [im_a] * 2 + [im_n] * 2 + [im_e] * 2

或者,更一般地说:

d = len(elements) - 1
cond_list = list(chain.from_iterable([el]*d for el in elements))
# or
cond_list = sum(([el]*d for el in elements), [])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多