python csv到嵌套列表,计数器

python csv到嵌套列表,计数器,python,bash,csv,Python,Bash,Csv,我正在尝试做一些在Python(2.7.6)中可能不太难的事情,但我离解决方案还差得远。这是一个功能磁共振成像实验(特别是在实验中)。我有一个csv,看起来像这样: level,string,key 1,string11,1 1,string12,0 1,string13,1 2,string21,1 2,string22,1 2,string23,0 共有20个级别(1:20),csv大约有5000条记录。我想做的是从第二列中显示一个特定级别的字符串(起始级别提前确定)。例如,我们测试了一个

我正在尝试做一些在Python(2.7.6)中可能不太难的事情,但我离解决方案还差得远。这是一个功能磁共振成像实验(特别是在实验中)。我有一个csv,看起来像这样:

level,string,key
1,string11,1
1,string12,0
1,string13,1
2,string21,1
2,string22,1
2,string23,0
共有20个级别(1:20),csv大约有5000条记录。我想做的是从第二列中显示一个特定级别的字符串(起始级别提前确定)。例如,我们测试了一个受试者,确定他们将从5级开始。从第5级显示一个随机字符串(例如,“奶牛是动物”)。受试者按下“真/假”按钮(回答“键”列-1/0)。棘手的一点是,每4个连续的正确答案,级别增加1,一个不正确的答案,级别降低1

时间/效率有点重要,所以我认为可以提前解析csv,然后在实验过程中工作的部分只是访问按级别存储的数据。我看过嵌套字典,似乎不对。也许是嵌套列表?我有点不知所措。我用bash编写了一个工作示例,以防比我的解释更清楚

#!/bin/bash

csv="file.csv"
level="5"
ilevel="0"
counter="1"

while [ "$counter" -le 10 ]; do
    stim=$(awk -F',' -v l="$level" '{if($1==l) print $2","$3}' "$csv"|sort -R|head -n1)
    stim1=$(echo "$stim"|cut -d',' -f1)
    stim2=$(echo "$stim"|cut -d',' -f2)
    read -p "$stim1 (t/f): " ANS 
    if [[ "$stim2" == "1" && "$ANS" == "t" || "$stim2" == "0" && "$ANS" == "f" ]]; then #if correct
        ilevel=$(echo "scale=2;$ilevel+.25"|bc) #add .25 to ilevel counter
        if [[ "$ilevel" == "1.00" ]]; then
            if [[ "$level" < "20" ]]; then
                level=$(echo "$level+1"|bc) #increase level
            fi
            ilevel=0
        fi
    else
        if [[ "$level" > "1" ]]; then #if incorrect
            level=$(echo "$level-1"|bc) #decrease level
        fi
        ilevel=0
    fi
    let "counter += 1"
done
#/bin/bash
csv=“file.csv”
级别=“5”
ilevel=“0”
计数器=“1”
而[“$计数器”-le 10];做
stim=$(awk-F','-vl=“$level”{if($1==l)print$2',“$3}'”$csv“| sort-R | head-n1)
stim1=$(回显“$stim”| cut-d','-f1)
stim2=$(回显“$stim”|切割-d','-f2)
读-p“$stim1(t/f):”ANS
如果[“$stim2”==“1”&&“$ANS”==“t”| |“$stim2”==“0”&“$ANS”==“f”];那么#如果正确的话
ilevel=$(echo“scale=2;$ilevel+.25”| bc)#将.25添加到ilevel计数器
如果[“$ilevel”==“1.00”];然后
如果[“$level”<“20”];然后
级别=$(回显“$级别+1”| bc)#增加级别
fi
ilevel=0
fi
其他的
如果[“$level”>“1”];然后#如果不正确
级别=$(回显“$level-1”| bc)#降低级别
fi
ilevel=0
fi
设“计数器+=1”
完成

bash脚本只是为了一个工作示例——计数器、打印到屏幕、用户反馈。。在现实中,所有这些都是以不同的方式处理的,并且已经完成了。我只需要计算csv的排序和级别。提前感谢您的建议。

要对字符串进行分组,请使用dict和random。选择要选择随机字符串:

 from collections import defaultdict
import csv
from random import choice
d = defaultdict(list)


with open("in.csv") as f:
    next(f)
    r = csv.reader(f)
    for row in r:
        d[int(row[0])].append(row[1])


level = 2

ch = choice(d[level])
print(ch)
string21
如果您需要答案/第2栏:

from collections import defaultdict

d = defaultdict(defaultdict)

with open("in.csv") as f:
    next(f)
    r = csv.reader(f)
    for row in r:
        d[int(row[0])][row[1]] = row[2]

from pprint import pprint as pp
pp(dict(d))
level = 2
ch = choice(list(d[level]))
ans = d[level][ch]
print(ch,ans)
输出:

 # main dict keys are levels, nested dict contain key/value pairing
 # question and answer
{1: defaultdict(None, {'string11': '1', 'string12': '0', 'string13': '1'}),
 2: defaultdict(None, {'string21': '1', 'string23': '0', 'string22': '1'})}
主dict键是levels,嵌套dict保存所有level字符串,这些字符串是嵌套dict的键,值是第3列的答案

如果您使用的是一个gui(看起来您是),那么您的逻辑将类似于以下内容,但显然使用的是您的gui方法:

level = 2
streak = 0
# current level questions
level_choice = list(d[level])

while True:
    # pick random string/question
    ch = choice(level_choice)
    # correct answer
    ans = d[level][ch]
    inp = raw_input("ask questions using ch")
    # if answer  is correct increment streak
    if inp == ans:
        streak += 1
    else:
        # else it is wrong, drop a level and update variables
        level -= 1
        streak = 0
        level_choice = list(d[level])
    # if we have four in a row, up level ad again update variables
    if streak == 4:
        level += 1
        streak = 0
        level_choice = list(d[level])

显然,一定会有这样一种情况:大量错误的答案将意味着等级将达到0,因此这可能是打破这种逻辑的时候,你将不得不做出决定。如果你不想重复提问,那么你就必须把它们从口述中删除。

我还是不明白。通过操纵可用的工作CSV文件,您到底想做什么?你能手动显示你所说的操纵是什么意思吗?谢谢你的评论,但我认为我无法更好地解释它,bash示例展示了它的总体思想。谢谢你的评论,我得到了这个错误
d[int(row[0])][row[1]=row[2];TypeError:列表索引必须是整数,而不是str
@user4987992,对不起,忘记添加导入和更新的dict结构谢谢!完美地工作