问题描述
目标:在单个易于理解的语句中创建一个元组,该元组由 Pandas 数据框的列标题和一个附加列组成。
例如说:
df.columns = ['a','b','c']
fname = 'sample.txt'
我可以在三个语句中创建元组 ('a','c','sample.txt') 如下:
y = [x for x in df.columns]
y.append(fname)
mytuple = tuple(y)
它可读,但冗长。我可以将其简化为两个语句:
y = [x for x in df.columns].append(fname)
mytuple = tuple(y)
这还不错,但我还是更喜欢一行一行。 我的想法 A 是一个单行语句应该像这样工作:
mytuple = tuple([x for x in df.columns].append(fname))
唉,这产生了错误:
TypeError: 'nonetype' 对象不可迭代
我也试过 B(猜测)
mytuple = tuple([[x for x in df.columns].append(fname)])
但这给出了错误的结果
(无,)
我想知道三件事:
- 为什么选项 A 不像我认为的那样工作。
- 有没有办法在单个语句中(非迟钝地)做到这一点。
- 如果是这样,它是如何完成的?
解决方法
您不需要先创建列表;只需使用参数解包运算符:
mytuple = (*df.columns,fname)
,
public static void main(String[] args) throws ParseException{
String s = "{\"stats\": {\"minecraft:mined\": {\"minecraft:lily_of_the_valley\": 1}}}";
JSONParser parser = new JSONParser();
Object obj = parser.parse(s);
JSONObject base = (JSONObject) obj;
JSONObject stats = (JSONObject) base.get("stats");
JSONObject minecraft_mined = (JSONObject) stats.get("minecraft:mined");
long minecraft_lily_of_the_valley = (long) minecraft_mined.get("minecraft:lily_of_the_valley");
System.out.println(base);
System.out.println(stats);
System.out.println(minecraft_mined);
System.out.println(minecraft_lily_of_the_valley);
}
改变列表,但返回 list.append()
。这就是你的错误的原因。要将其写在一行中,请使用列表连接而不是 None
:
list.append()
,
mytuple = tuple(list(df.columns) + [fname])
虽然,@kaya3 solution 可能是最好的
,因为 .append()
不返回任何东西(它返回 None)。
它是这样完成的:
print(tuple([x for x in df.colums] + [fname]))
或者如果 df.colums
已经是一个列表:
print(tuple(df.colums + [fname]))