Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—制作一个具有可变数量键/值的字典_Python_Dictionary_Variadic Functions - Fatal编程技术网

Python—制作一个具有可变数量键/值的字典

Python—制作一个具有可变数量键/值的字典,python,dictionary,variadic-functions,Python,Dictionary,Variadic Functions,好吧,标题有点混乱,但让我详细解释一下 Java中的一些方法有一个有用的东西叫做varargs,它允许方法中有不同数量的参数。它看起来像这样: void method(String... args) { for (String arg : args) { // TODO } } import csv with open('example1.csv') as f: rows = list(csv.DictReader(f)) print(rows) #

好吧,标题有点混乱,但让我详细解释一下

Java中的一些方法有一个有用的东西叫做
varargs
,它允许方法中有不同数量的参数。它看起来像这样:

void method(String... args) {
    for (String arg : args) {
        // TODO
    }
}
import csv

with open('example1.csv') as f:
    rows = list(csv.DictReader(f))

print(rows)
# -> [{'name': 'Alice', 'AGATC': '2', 'AATG': '8', 'TATC': '3'}]
我正试图通过一门课程学习Python,其中一项作业是让我获取一个CSV文件,该文件顶部有数量不等的字符串,表示一条链中重复的DNA序列。下面是一个例子:

name,AGATC,AATG,TATC
Alice,2,8,3
但是,它们也提供不同的CSV文件,这些文件有不同数量的DNA序列需要检查,如下例所示:

name,AGATC,TTTTTTCT,AATG,TCTAG,GATA,TATC,GAAA,TCTG
Jason,15,49,38,5,14,44,14,12
(数字等于上述DNA序列在其链中重复的数量。因此Jason在该链中有15个AGATC重复)

我想使用一个Dictionary变量来存储名称及其所有重复项。然而,由于我事先不知道我需要检查多少DNA序列,所以字典中必须有任意数量的序列有没有一种方法可以在Python
字典中使用类似于Java的
varargs
的东西?

我想要的输出格式是将DNA数据库中的人群及其重复转换为一个列表,其中包含一个与每个人等同的词典。因为CSV文件可以包含可变数量的DNA序列(如上所示),所以我想让每个人的字典将他们的名字作为他们的第一个密钥,然后在CSV文件中为每个DNA序列添加额外数量的密钥。下面是一个与上述CSV文件片段一致的示例:
{“name”:“Jason”、“seq1:15”、“seq2:49”、“seq3:38”、“seq4:5”、“seq5:14”、“seq6:4”、“seq7:14”、“seq8:12}
您可以使用
*args
获取包含所有参数的列表

def my_seq(*args): 
    for arg in args: 
        print (arg)
   
my_seq('a', 'b', 'c', 'd') 
所有Python字典都有数量可变的项,因为它们是可变的,所以这有点像一个函数,但是为了得到您想要的,您可以使用(as)

让我们调用您的第一个示例
example1.csv

name、AGATC、AATG、TATC
爱丽丝,2,8,3
要阅读它,您可以执行以下操作:

void method(String... args) {
    for (String arg : args) {
        // TODO
    }
}
import csv

with open('example1.csv') as f:
    rows = list(csv.DictReader(f))

print(rows)
# -> [{'name': 'Alice', 'AGATC': '2', 'AATG': '8', 'TATC': '3'}]
数字不会自动转换为整数,但您可以使用dict理解:

rows = [
    {k: v if k == 'name' else int(v) for k, v in row.items()}
    for row in rows
    ]
print(rows)
# -> [{'name': 'Alice', 'AGATC': 2, 'AATG': 8, 'TATC': 3}]
请注意,DNA序列本身作为键可能比
'seq1'
'seq2'
等更有用。例如,如果您以
行2
的形式读入其他CSV,则可以对键执行类似set的操作:

>>> alice = rows[0]
>>> jason = rows2[0]
>>> len(alice.keys() - jason.keys())  # How many keys are unique to Alice?
0
>>> jason.keys() - alice.keys()  # What keys does Jason have that Alice doesn't?
{'TCTAG', 'GATA', 'TCTG', 'TTTTTTCT', 'GAAA'}

如果您想获得真正的高级,可以使用数据帧。这里只是一个简短的例子,因为我自己对它不太熟悉:)

输出:

       AGATC  TTTTTTCT  AATG  TCTAG  GATA  TATC  GAAA  TCTG
name                                                       
Jason     15        49    38      5    14    44    14    12
Alice      2       NaN     8    NaN   NaN     3   NaN   NaN

Python dict是可变的,因此您可以根据需要添加任意多的键/值对。您不需要在Python中预先分配空间。Python有varargs:
def method(*args):
。你也可以递一份清单。我看不出
varargs
与您试图做的事情之间有什么关联。您想要的输出是什么?我不懂Java,但我可以向您展示如何在Python中获得所需的内容。请看一看实现这一点的直接方法。@JNSStudios_YT,这样您就不用像
AGATC
这样的字符串作为dict键了——只是一个序列号?如果是这样,为什么不使用一个列表
seq
,然后用
seq[1]
seq[2]
等索引到其中。这是一种更自然的方法来保存顺序重要的数据。
*args
是常用名称
argv
在Python中通常只引用命令行参数。