Dart 新手,正在尝试进入 Flutter。是否可以在不循环的情况下将 MapEntry 转换为 Map,或者使用更短的方法/更好的性能方式来实现相同的结果?
我有一个 Iterable 的返回类型,MapEntry<String, int> 如下所示。
final Map<String, int> laptopPricing = <String, int>{
'MacM1': 120000,
'RogFlowX13': 170000,
'LenovoLegion': 110000
};
const int budgetOnHand = 150000;
final laptopWithinBudget = laptopPricing.entries.where((element) => element.value <= budgetOnHand); //filtering a map using entries's value
print(laptopWithinBudget); //prints (MapEntry(MacM1: 120000), MapEntry(LenovoLegion: 110000)) because the "where" method returns an Iterable MapEntry
Run Code Online (Sandbox Code Playgroud)
我想做的是将带有 MapEntry 的 Iterable 转换为一个简单的 Map,只有 Key 和 Value,集合中没有“MapEntry”,并且不使用任何类型的循环方法进行转换。(出于性能问题的考虑,只是尝试学习并看看是否可以在不使用任何循环的情况下实现)(此外,任何最佳实践/更好的方法或建议,例如“您甚至不应该使用如果你这样做的话,这是非常受欢迎的:D)
我已经设法用 map 方法实现了它(据我所知,这被认为是循环,因为它迭代集合中的所有元素,但如果我错了,请纠正我)
final returnsMapUsingLooping = Map.fromIterables(
laptopWithinBudget.map((e) => e.key),
laptopWithinBudget.map((e) => e.value)); …
Run Code Online (Sandbox Code Playgroud) 我正在教自己Python 3.2,我正在尝试创建一个匹配名单的程序.pList是一个多维列表,第0列为字符串,第1列为整数,第2列为布尔值.但是,每当我尝试调用此函数时(只有在列表中的行数为偶数时才会运行),我得到一个TypeError.
Traceback (most recent call last):
File "C:\Users\METC\Dropbox\assassins.py", line 150, in <module>
main()
File "C:\Users\METC\Dropbox\assassins.py", line 11, in main
update(ops, pList)
File "C:\Users\METC\Dropbox\assassins.py", line 125, in update
b = match(pList)
File "C:\Users\METC\Dropbox\assassins.py", line 47, in match
q, p = 0
TypeError: 'int' object is not iterable
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激,但请记住,我是一个语言的初学者,所以要温柔.:)我不介意你是否太技术了; 我有计算机科学的经验.
def match(pList):
b = []
z = len(pList)-1
for x in range(z):
b.append([pList[x][0],0])
for x in range(z):
isValid = False
q, p = 0
while isValid == False:
q = random.randint(0, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个可迭代的类,但是可以说,我一直在用头撞墙,得到“对象不可迭代”。这是我的代码:
class myiterable:
def __init__(self, somelist):
self.i = 0
self.l = somelist
def __iter__(self):
return self
def __next__(self):
if self.i < len(self.l):
self.i = self.i + 1
return self.l[self.i-1]
else:
raise StopIteration
for i in myiterable([1, 2, 3, 4, 5]):
print(i)
Run Code Online (Sandbox Code Playgroud)
怎么了?我也尝试next(self)
过__next__(self)
没有效果!
我手边有一个体面大小的文本文件(~23MB).我正在逐行读取文件,并根据一些外部标准从每行中提取几个单词.为了这个例子,让我们说每行包含至少六个以制表符分隔的值,除了第一个和最后一个之外,我正在接收所有这些值.
我想输出以这种方式获得的一组唯一单词,所以显然我想将提取的单词存储在一个set
.此外,由于set.update(other)
比循环other
和一次添加一个单词要快得多set.add(elem)
,我尝试这样做:
all_words = set()
with open(my_tsv_file) as tsv_file:
for line in tsv_file:
wordlist = based_on_some_criteria(line) # this is a list, not a set
all_words.update(wordlist)
Run Code Online (Sandbox Code Playgroud)
这很好用.但是当我替换all_words.update(wordlist)
时all_words |= wordlist
,我得到以下错误:
TypeError: unsupported operand type(s) for |=: 'set' and 'list'
Run Code Online (Sandbox Code Playgroud)
从文档中,我理解update
并且|=
是等效的.此外,因为|=
应该接受任何迭代,我也通过这样做证实:
import collections
isinstance(wordlist, collections.Iterable) # returns True
Run Code Online (Sandbox Code Playgroud)
为什么第一种方法使用set.update
工作,而不是第二种方法使用|=
?
我正在编写一个实现迭代器的内部类,我正在尝试为我的一个方法返回一个整数,但它不会让我.我知道这是一个非常基本的问题,但我是java的新手,所以我很抱歉听起来很简单.
public class pIterator<Integer> implements Iterator<Integer>{
private int currentEx = 1;
private int base = 4;
//error says can't convert int to Integer here specifically
private Integer changeToInteger = base * currentEx++;
@Override
public boolean hasNext() {
return currentEx <= max;
}
//the problem then occurs here when I try to return an Integer
@Override
public Integer next() throws NoSuchElementException {
if (currentEx > max) throw new NoSuchElementException();
return changeToInteger;
}
}
Run Code Online (Sandbox Code Playgroud)
currentEx和base必须是int(由指令定义)所以我应该只更改返回类型还是可以转换为整数?
根据java文档说:
在Iterable<T>
允许一个对象被用作换每个语句的目标.
在java中,我们可以执行以下操作:
for (final <? super T> : T[]) {...}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为什么java不能将T []类型的对象视为Iterable,因为以下崩溃时出现了不可比较的类型编译错误:
final Iterable<T> anIterable = T[];
Run Code Online (Sandbox Code Playgroud) 我可以在Python shell中执行这两个表达式而不会出错:
string ='this is a string'list
(string)[:: - 1](输出)['g','n','i','r','t','s','','a','','s','i','',' s','i','h','t']
list(字符串).reverse()
我可以:
string =''.join(list(string)[:: - 1])
这有效地扭转了弦.但是,当我这样做时:
string =''.join(list(string).reverse()
我收到一个错误:
TypeError:只能加入一个iterable
所以list(string).reverse()不返回可迭代但是list(string)[:: - 1].有人能帮我理解潜在的差异吗?
是否有一种更 Pythonic 的方式(即在一行中,没有循环,也没有简单的初始化)来计算all
下面的列表?
all = []
for iterable in iterables:
all.extend(iterable) # add all elements in 'iterable' to 'all'
Run Code Online (Sandbox Code Playgroud)
编辑:如果解决方案需要线性时间就可以了。我只是想要一种更易读、更短、更直接的方式。
可下标对象和可迭代对象有什么区别?什么是可下标但不可迭代的对象,反之亦然?
Ps 可下标的是其中包含其他对象的对象,迭代器是可下标的,可以迭代。但我能想到的也仅此而已。
重写的方法想要返回,Iterable<T>
但在我拥有的方法中Iterable<String>
.我怎样才能返回Iterable<T>
从Iterable<String>
,甚至Set<String>
?
码:
@Override
public Iterable<T> getAll() {
Set<String> set = getCache().keySet();
Iterable<String> iter = set;
return ?
}
Run Code Online (Sandbox Code Playgroud) 在 C# 中,我可以将单个元素转换为IEnumerable<>
如下所示(此处使用扩展方法):
static class Extensions
{
static IEnumerable<T> Yield<T>(this T t)
{
yield return t;
}
}
Run Code Online (Sandbox Code Playgroud)
当我需要在IEnumerable<>
某处输入但只有一个元素时,我会使用它,如下所示:
var myList = new List<string>("foo".Yield());
Run Code Online (Sandbox Code Playgroud)
在 Java 中是否有一些等效的方法可以做到这一点?
Iterable<>
我对从像这样的元素实际创建堆上不感兴趣
List<String> myIterable = new ArrayList<String>();
myIterable.add("foo");
Run Code Online (Sandbox Code Playgroud)
因为我已经知道那种解决方案;我想知道 Java 是否可以像 C# 一样强大且惰性地处理可枚举/可迭代(C# 有 Linq 和 Yield Return,Java 有 Streams)。
我熟悉这个split
功能,我会这样使用它:
str = "Line1-abcdef \nLine2-abc \nLine4-abcd"
print str.split( )
Run Code Online (Sandbox Code Playgroud)
以上将返回:
['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
Run Code Online (Sandbox Code Playgroud)
简单易行.但是,我遇到了一段包含此声明的代码:
(line, str) = str.split("\n", 1)
Run Code Online (Sandbox Code Playgroud)
这里有两件事我不明白:
第二个参数split
和它的作用.我看了看这里,它说的是行数.那是什么意思?
split
返回一个可迭代的向量.为什么要分配(line, str)
?(line, str)
这里的意思是什么?
在下面的示例中,我迭代字典列表,并将“年龄”保存在列表中。然而,第二个字典没有键“年龄”。在这种情况下,我希望将 null 值保存在列表中。关于如何实现这一目标有什么建议吗?
my_list = [{'age': 0, 'name': 'A'}, {'name': 'B'}, {'age': 2, 'name': 'C'}, {'age': 3, 'name': 'D'}, {'age': 4, 'name': 'E'}, {'age': 5, 'name': 'F'}]
ages = [li['age'] for li in my_list]
Run Code Online (Sandbox Code Playgroud)