- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试做一些在 Python (2.7.6) 中可能不那么困难的事情,但我离解决方案还差得很远。这是用于 fMRI 实验(特别是在实验中)。我有一个看起来像这样的 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
bash 脚本仅用于工作示例 - 计数器、打印到屏幕、用户反馈......在现实中处理方式各不相同,并且已经完成。我只需要弄清楚 csv 的排序和操纵级别。提前感谢您的任何建议。
最佳答案
要对字符串进行分组,请使用字典并使用 random.choice 来选择随机字符串:
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'})}
主字典键是级别,嵌套字典包含所有级别字符串,它们是嵌套字典的键,值是第 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,因此可能是打破的时候了,你必须决定这个逻辑。如果您不想重复问题,则必须将它们从字典中删除。
关于python csv 到嵌套列表,计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30719553/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!