我想在蛋白质序列中每10个字符插入一个换行符:
seq="MSKNKSPLLNESEKMMSEMLPMKVSQSKLNYEEKVYIPTTIRNRKQHCFRRFFPYIALFQ"
Run Code Online (Sandbox Code Playgroud)
在Perl中,它非常简单:
$seq=~s/(.{10})/$1\n/g ; # does the job!
perl -e '$seq="MSKNKSPLLNESEKMMSEMLPMKVSQSKLNYEEKVYIPTTIRNRKQHCFRRFFPYIALFQ"; $seq=~s/(.{10})/$1\n/g; print $seq'
MSKNKSPLLN
ESEKMMSEML
PMKVSQSKLN
YEEKVYIPTT
IRNRKQHCFR
RFFPYIALFQ
Run Code Online (Sandbox Code Playgroud)
在朱莉娅,
replace(seq, r"(.{10})" , "\n")
Run Code Online (Sandbox Code Playgroud)
不起作用,因为我不知道如何获取捕获组(.{10})并将其替换为自己+"\n"
julia> replace(seq, r"(.{10})" , "\n")
"\n\n\n\n\n\n"
Run Code Online (Sandbox Code Playgroud)
所以要做到这一点,我需要两个步骤:
julia> a=matchall(r"(.{1,10})" ,seq)
6-element Array{SubString{UTF8String},1}:
"MSKNKSPLLN"
"ESEKMMSEML"
"PMKVSQSKLN"
"YEEKVYIPTT"
"IRNRKQHCFR"
"RFFPYIALFQ"
julia> b=join(a, "\n")
"MSKNKSPLLN\nESEKMMSEML\nPMKVSQSKLN\nYEEKVYIPTT\nIRNRKQHCFR\nRFFPYIALFQ"
julia> println(b)
MSKNKSPLLN
ESEKMMSEML
PMKVSQSKLN
YEEKVYIPTT
IRNRKQHCFR
RFFPYIALFQ
# Caution :
a=matchall(r"(.{10})" ,seq) # wrong if seq is not exactly a multiple of 10 !
julia> seq
"MSKNKSPLLNESEKMMSEMLPMKVSQSKLNYEEKVYIPTTIRNRKQHCFRRFFPYIAL"
julia> matchall(r"(.{10})" ,seq) …
Run Code Online (Sandbox Code Playgroud) 我想知道一种在GO中打印表格的简单有效的方法。我找到的解决方案有效,但它真的很难看。
许多坦克!
outfile := "file.tsv"
f, err := os.Create(outfile)var buffer bytes.Buffer
buffer.WriteString(a[i])
buffer.WriteString("\t")
buffer.WriteString(a[j])
buffer.WriteString("\t")
buffer.WriteString(strconv.FormatFloat(x, 'f', 4, 64))
buffer.WriteString("\n")
// // write results to outfile
f.WriteString(buffer.String())
Run Code Online (Sandbox Code Playgroud) 在GO中,当我使用结构作为地图的键时,键是一个单一的.
例如,以下代码生成仅包含一个键的映射:map [{x 1}:1]
package main
import (
"fmt"
)
type MyT struct {
A string
B int
}
func main() {
dic := make(map[MyT]int)
for i := 1; i <= 10; i++ {
dic[MyT{"x", 1}] = 1
}
fmt.Println(dic)
}
// result : map[{x 1}:1]
Run Code Online (Sandbox Code Playgroud)
我试图在朱莉娅做同样的事情,我有一个奇怪的惊喜:
这个Julia代码,类似于GO代码,生成一个带有10个键的字典!
type MyT
A::String
B::Int64
end
dic = Dict{MyT, Int64}()
for i in 1:10
dic[MyT("x", 1)] = 1
end
println(dic)
# Dict(MyT("x",1)=>1,MyT("x",1)=>1,MyT("x",1)=>1,MyT("x",1)=>1,MyT("x",1)=>1,MyT("x",1)=>1,MyT("x",1)=>1,MyT("x",1)=>1,MyT("x",1)=>1,MyT("x",1)=>1)
println(keys(dic))
# MyT[MyT("x",1),MyT("x",1),MyT("x",1),MyT("x",1),MyT("x",1),MyT("x",1),MyT("x",1),MyT("x",1),MyT("x",1),MyT("x",1)]
Run Code Online (Sandbox Code Playgroud)
那我做错了什么?
谢谢@DanGetz的解决方案!:
immutable MyT # or struct MyT …
Run Code Online (Sandbox Code Playgroud) 我尝试用 Go 编写一个程序,在非常大的 DNA 序列文件中查找一些基因。我已经编写了一个 Perl 程序来执行此操作,但我想利用 goroutine 并行执行此搜索;)
因为文件很大,所以我的想法是一次读取 100 个序列,然后将分析发送到 goroutine,然后再次读取 100 个序列,依此类推。
我要感谢这个网站的成员对于切片和 goroutine 的非常有用的解释。
我已经进行了建议的更改,以使用 goroutine 处理的切片的副本。但 -race 执行仍然在函数级别检测到一个数据竞争copy()
:
非常感谢您的评论!
==================
WARNING: DATA RACE
Read by goroutine 6:
runtime.slicecopy()
/usr/lib/go-1.6/src/runtime/slice.go:113 +0x0
main.main.func1()
test_chan006.go:71 +0xd8
Previous write by main goroutine:
main.main()
test_chan006.go:63 +0x3b7
Goroutine 6 (running) created at:
main.main()
test_chan006.go:73 +0x4c9
==================
[>5HSAA098909 BA098909 ...]
Found 1 data race(s)
exit status 66
line 71 is : copy(bufCopy, buf_Seq)
line 63 is : buf_Seq = append(buf_Seq, …
Run Code Online (Sandbox Code Playgroud) haskey()和in()函数对于测试Julia中的字典内容非常有用:
julia> dict = Dict("a" => 1, "b" => 2, "c" => 3, "d" => 4, "e" => 5)
Dict{String,Int64} with 5 entries:
"c" => 3
"e" => 5
"b" => 2
"a" => 1
"d" => 4
julia> haskey(dict, "a")
true
julia> in(("a" => 1), dict)
true
Run Code Online (Sandbox Code Playgroud)
但他对复杂键的行为感到惊讶:
julia> immutable MyT
A::String
B::Int64
end
julia> a = Dict(MyT("Tom",191)=>1,MyT("Bob",20)=>1,MyT("Jo",315)=>1,MyT("Luc",493)=>1)
Dict{MyT,Int64} with 4 entries:
MyT("Tom",191) => 1
MyT("Jo",315) => 1
MyT("Bob",20) => 1
MyT("Luc",493) => 1
julia> keys(a)
Base.KeyIterator for a …
Run Code Online (Sandbox Code Playgroud) 我尝试了许多方法来构建struct映射并向其附加值,但没有找到任何方法。
地图的键是字符串。该结构由两部分组成:“ x”整数和“ y”字符串切片。
我在构建地图时遇到的错误是(对于m): main.go:11: syntax error: unexpected comma, expecting semicolon, newline, or }
当我尝试向地图添加新的键和值时,错误为: go:33: syntax error: missing operand
非常感谢您帮助我发现错误!
package main
import "fmt"
type TEST struct {
x int
y []string
}
// none of these var gives the expected result
var m = map[string]*struct{x int, y []string}{"foo": {2, {"a", "b"}}, }
var m2 = map[string]struct{x int, y []string}{"foo": {2, {"a", "b"}}, }
var n = map[string]*struct{x int
y []string
}{"foo": {2, {"a", "b"}}, }
var o …
Run Code Online (Sandbox Code Playgroud) 我尝试用并行的goroutine编写一个复杂的程序.这是我的第一个带有通道的程序;)每个goroutine返回一个数组,不幸的是,结果是"随机的".如果我运行10次程序,我有10个不同的结果:(
这是我的程序的过度简化,结果很好(可能因为它太简单了)但是当我用-race参数运行它时,有4个数据竞争.
我试过有一个close()函数,但它没有用.
你可以帮我找错吗?非常感谢你提前!
package main
import "fmt"
import "sync"
import "strconv"
func cat_strings(a int, b string) []string{
var y []string
j := strconv.Itoa(a)
y = append(y, j)
y = append(y, b)
return y
}
func main() {
var slice []string
var wg sync.WaitGroup
var x []string
queue := make(chan []string, 10)
wg.Add(10)
for i := 0; i < 10; i++ {
go func(i int) {
defer wg.Done()
x = cat_strings(i, "var")
queue <- x
}(i)
}
//close(queue)
go func() …
Run Code Online (Sandbox Code Playgroud)