如何解决Python将字符串中的多个位置分别转换为多个字母
我正在尝试编写一个python代码,以发现DNA序列内的限制酶位点。限制酶切割特定的DNA序列,但是有些酶并不严格,例如XmnI切割该序列:
GAANNNNTTC
其中N可以是任何核苷酸(A,C,G或T)。如果我的数学是正确的,那就是4 ^ 4 = 256个可以剪切的唯一序列。我想列出这256个短序列,然后对照(较长)输入的DNA序列检查每个短序列。但是,我很难生成256个序列。这是我到目前为止的内容:
cutsequencequery = "GAANNNNTTC"
Nseq = ["A","C","G","T"]
querylist = []
if "N" in cutsequencequery:
Nlist = [cutsequencequery.replace("N",t) for t in Nseq]
for j in list(Nlist):
querylist.append(j)
for i in querylist:
print(i)
print(len(querylist))
这是输出:
GAAAAAATTC
GAACCCCTTC
GAAGGGGTTC
GAATTTTTTC
4
因此它将每个N切换为A,C,G和T,但是我想我需要另一个循环(或3个)来生成所有256个组合。有没有一种我看不到的有效方法?
解决方法
也许您应该看看python's itertools library,其中包括private static final ObjectMapper MAPPER = Json.mapper();
,它会为每个可迭代对象的组合创建一个可迭代对象,因此:
import 'dart:async';
import 'package:flutter/material.dart';
class WebScrollbar extends StatefulWidget {
final Widget child;
final ScrollController controller;
final double heightFraction;
final double width;
final Color color;
final Color backgroundColor;
final bool isAlwaysShown;
final Function scrollCallBack;
final double value;
WebScrollbar({
this.value,this.scrollCallBack,this.child,this.controller,this.heightFraction = 0.20,this.width = 8,this.color = Colors.black45,this.backgroundColor = Colors.black12,this.isAlwaysShown = false,}) : assert(child != null),assert(controller != null),assert(heightFraction != null &&
heightFraction < 1.0 &&
heightFraction > 0.0),assert(width != null),assert(color != null),assert(backgroundColor != null),assert(isAlwaysShown != null);
@override
_WebScrollbarState createState() => _WebScrollbarState();
}
class _WebScrollbarState extends State<WebScrollbar> {
double _scrollPosition = 0;
bool _isUpdating;
Timer timer;
_scrollListener() {
setState(() {
_scrollPosition = widget.controller.position.pixels;
});
}
@override
void initState() {
widget.controller.addListener(_scrollListener);
_isUpdating = false;
super.initState();
}
@override
Widget build(BuildContext context) {
var screenSize = MediaQuery.of(context).size;
double _scrollerHeight = screenSize.height * widget.heightFraction;
double _topMargin = widget.controller.hasClients
? ((screenSize.height *
_scrollPosition /
widget.controller.position.maxScrollExtent) -
(_scrollerHeight *
_scrollPosition /
widget.controller.position.maxScrollExtent))
: 0;
return NotificationListener<ScrollNotification>(
onNotification: (notification) {
if (notification.depth == 0) {
if (notification is ScrollUpdateNotification) {
timer.cancel();
setState(() {
_isUpdating = true;
});
} else {
timer = Timer(Duration(seconds: 5),() {
setState(() {
_isUpdating = false;
});
});
}
// print(_isUpdating);
}
return true;
},child: Stack(
children: [
widget.child,AnimatedOpacity(
opacity: widget.isAlwaysShown
? 1
: widget.controller.hasClients
? _isUpdating
? 1
: 0
: 0,duration: Duration(milliseconds: 900),child: Container(
alignment: Alignment.centerRight,height: MediaQuery.of(context).size.height,width: 10,margin: EdgeInsets.only(
left: MediaQuery.of(context).size.width - 10,),color: widget.backgroundColor,child: Align(
alignment: Alignment.topCenter,child: GestureDetector(
child: Container(
height: _scrollerHeight,width: widget.width,margin: EdgeInsets.only(
left: 1.0,right: 1.0,top: _topMargin,decoration: BoxDecoration(
color: widget.color,borderRadius: BorderRadius.all(
Radius.circular(3.0),onTapCancel: () {
timer = Timer(Duration(seconds: 10),() {
setState(() {
_isUpdating = false;
});
});
},onTapDown: (details) {
timer.cancel();
setState(() {
_isUpdating = true;
});
},onVerticalDragUpdate: (dragUpdate) {
widget.controller.position
//Say in the line of code below. **The value (3.5)** should be manually set on each page of the app.//
.moveTo(dragUpdate.globalPosition.dy * 3.5);
setState(() {
if (dragUpdate.globalPosition.dy >= 0 &&
_scrollPosition <=
widget.controller.position.maxScrollExtent) {
_scrollPosition = dragUpdate.globalPosition.dy +
dragUpdate.globalPosition.dy *
(_scrollPosition /
widget
.controller.position.maxScrollExtent) -
(_scrollerHeight *
_scrollPosition /
widget.controller.position.maxScrollExtent);
}
});
},],);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。